Spring

Spring 概述

简介

  • Spring 是一个开源免费的框架,容器
  • Spring 是一个轻量级的框架,非侵入性的
  • 控制反转IoC,面向切片
  • 对事物的控制,对框架的支持

总结一句话:Spring就是一个轻量级的控制反转(IoC)和面向切面编程(AOP)的框架

组成

  • Spring
  • Spring boot
  • Spring Cloud

IoC理论

​ 控制反转是一种通过描述(XML或注释)并通过第三方生产或者获取特定对象的方式,在Spring中实现控制反转的是IoC容器,其实现方式是依赖注入(Dependency Injection DI)

第一个Spring程序

IoC创建对象方式

通过无参构造方法创建

通过有参构造方法创建

在配置文件加载的时候,其中管理的对象都已经初始化了

Spring配置说明

别名 alias

alias设置别名,为bean设置别名,可以设置多个别名

<alias name = "userT" alias="userNew"/>

Bean的配置

<!--bean就是一个java对象,由Spring创建与管理
id是bean的标识符,要唯一,如果没有设置id,那么name就是默认标识符
如果配置了id又配置了name,那么name是别名
name可以设置多个别名

-->
< bean id="hello" name="hello2 h2,h3;h4" class="com.hml.pojo.Hello">
  <property name = "name" value="hml"/>
</bean>

import

团队的合作通过import来实现

<import resource="{path}/beans.xml"/>

依赖注入

概念

  • 依赖注入:Dependency Injection DI
  • 依赖:指的是Bean对象的创建依赖于容器,Bean对象的依赖资源
  • 注入:指的是Bean对象所依赖的资源,由容器来设置以及装配

构造器注入

之前作用到的方法均是构造器注入

Set注入

​ 要求被注入的属性,必须要有set方法,set方法的方法名由set+属性首字母大写,如果属性是boolean类型,那么没有set方法,是is

常量注入

<bean id="student" class="com.hml.pojo.Student">
  <property name="name" value="hml"/>
</bean>

bean注入

<bean id="addr" class="com.hml.pojo.Student">
  <property name="address" value="Beijing"/>
</bean>
<bean id="student" class="com.hml.pojo.Student">
  <property name="name" value="hml"/>
  <property name="address" ref="addr"/>
</bean>

数组注入

<bean id = "student" class="com.hml.pojo.Student">
<property name = "name" value="hml"/>
<property name = "address" ref ="addr"/>
<property name = "books">
	<array>
  	<value>西游记</value>
    <value>红楼梦</value>
    <value>水浒传</value>
  </array>  
</property>
</bean>

List注入

<property name = "hobbys">
	<list>
  	<value>listioning music</value>
    <value>watching movie</value>
    <value>climb</value>
  </list>
</property>

Map注入

<property name = "card">
	<map>
  	<entry key="中国邮政" value="111111111"/>
    <entry key="邮政" value = "22222222222"/>
  </map>
</property>

set注入

<property name="games">
	<set>
  	<value>LOL</value>
    <value>BOB</value>
    <value>COC</value>
  </set>
</property>

Null注入

<property name="wife"><null/></property>

Properties注入

<property name="info">
	<props>
  	<prop key="学号">201928013229133</prop>
    <prop key="sex">男</prop>
    <prop key="name">hml</prop>
  </props>
</property>

p命名和c命名注入

P命名空间注入 : 需要在头文件中加入约束文件


Bean的作用域

Singleton

在Spring IoC容器中仅存在一个Bean实例,Bean以单一方式存在

<bean id ="ServiceImpl" class = "com.hml.service.ServiceImpl scope = "singleton/>

prototype

当一个bean的作用域为Prototype,表示一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。在XML中将bean定义成prototype,可以这样配置:

 <bean id="account" class="com.foo.DefaultAccount" scope="prototype"/>  
or
 <bean id="account" class="com.foo.DefaultAccount" singleton="false"/>

request

当一个bean的作用域为Request,表示在一次HTTP请求中,一个bean定义对应一个实例;即每个HTTP请求都会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:

<bean id="loginAction" class=cn.csdn.LoginAction" scope="request"/>

session

当一个bean的作用域为Session,表示在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>

自动装配

自动装配说明

  • 自动装配是使用spring满足bean依赖的一种方法
  • spring会在应用上下文中为某一个bean寻找其依赖的bean

装配机制

  • 在xml中显式配置
  • 在java中显示配置
  • 隐式的bean发现机制与自动装配

Spring的自动装配需要从两个角度来实现,或者说是两个操作:

  1. 组件扫描(component scanning):spring会自动发现应用上下文中所创建的bean;
  2. 自动装配(autowiring):spring自动满足bean之间的依赖,也就是我们说的IoC/DI;

组件扫描和自动装配组合发挥巨大威力,使得显示的配置降低到最少。

推荐不使用自动装配xml配置 , 而使用注解 .

装配方法

byName

byType

使用注解

使用注解开发

说明

在Spring4之后,想要使用注解模式,必须要引入aop的包。

在配置文件中,还需要引入一个context约束。

Bean的实现

我们之前都是使用bean的标签进行bean注入,但是实际开发中,我们一般都会使用注解

1.配置扫描那些包下的注解

<!--指定注解扫描包-->
<context:component-scan base-package="com.hml.pojo"/>

2.在指定的包下编写类

@Component("user")
public class User{
  public String name = "hml";
}

属性注入

使用注解注入属性

1.可以不用提供set方法,直接在名上添加@value("值")

@Component("user")
public class User{
  @Value("hml")
  public String name;
  
}

2.如果提供了set

@Component("user")
public class User{
  public String name;
  @Value("hml")
  public void setName(String name){
    this.name = name;
  }
}

衍生注解

@Component的三个衍生注解

  • @Controller:web层
  • @Service:service层
  • @Repository:dao层

代理模式

为什么要学习代理模式,因为这是SpringAOP的底层。

我们在不改变原来的代码的情况下,实现了对原有功能的增强,这是AOP中最核心的思想

静态代理

  • 抽象角色:一般使用接口或者抽象类来实现
  • 真实角色:被代理的角色
  • 代理角色:代理真实角色,代理真实角色之后,一般会做一些附属的操作
  • 客户:使用代理角色来进行一些操作。

静态代理的好处:

  • 可以使我们的真实角色更加纯粹,不再去关注一些公共的事情
  • 公共的业务由代理来完成,实现了业务的分工
  • 公共业务发生拓展时变得更加集中与方便

静态代理的坏处:

  • 类多了,多了代理类,工作量变大了,开发效率有所降低。

动态代理

  • 动态代理的角色是和静态代理的一样
  • 动态代理的代理类是动态生成的,静态代理的代理类是我们提前写好的。
  • 动态代理分为两类:一类是基于接口的动态代理,另外一种是基于类的动态代理
    • 基于接口的动态代理----JDK动态代理
    • 基于类的动态代理----cglib
    • 现在用的比较多的是javasist来生成动态代理
    • 使用JDK的原生代码来实现。

JDK的动态代理需要两个类:

核心:InvocationHandler和Proxy

深入理解

AOP

什么是AOP

AOP在Spring中的作用

使用Spring实现AOP

通过Spring API

自定义类来实现AOP

使用注解实现

整合Mybatis

事务回顾

回顾事务

  • 要么都成功,要么都失败
  • 事务在开发的过程中,十分的终于,涉及到数据的一致性问题
  • 确保完整性与一致性

事务的ACID原则

A:原子性

C:一致性

I:隔离性 多个业务可能操作同一个资源,防止数据损坏

D:持久性 事务一旦提交,无论发生什么事情,数据都不能丢失

Spring声明事务

总结与回顾

posted @ 2021-04-14 16:56  BOTAK  阅读(61)  评论(0编辑  收藏  举报