2019-09-30
引用整理而来,非原创
Spring IoC 容器
1两种容器
BeanFactory
ApplicationContext
2Bean的定义
bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象。这些 bean 是由用容器提供的配置元数据创建的
class | 这个属性是强制性的,并且指定用来创建 bean 的 bean 类。 |
name | 这个属性指定唯一的 bean 标识符。在基于 XML 的配置元数据中,你可以使用 ID 和/或 name 属性来指定 bean 标识符。 |
scope | 这个属性指定由特定的 bean 定义创建的对象的作用域,它将会在 bean 作用域的章节中进行讨论。 |
constructor-arg | 它是用来注入依赖关系的,并会在接下来的章节中进行讨论。 |
properties | 它是用来注入依赖关系的,并会在接下来的章节中进行讨论。 |
autowiring mode | 它是用来注入依赖关系的,并会在接下来的章节中进行讨论。 |
lazy-initialization mode | 延迟初始化的 bean 告诉 IoC 容器在它第一次被请求时,而不是在启动时去创建一个 bean 实例。 |
initialization 方法 | 在 bean 的所有必需的属性被容器设置之后,调用回调方法。它将会在 bean 的生命周期章节中进行讨论。 |
destruction 方法 | 当包含该 bean 的容器被销毁时,使用回调方法。它将会在 bean 的生命周期章节中进行讨论。 |
3Bean的作用域
prototype和singleton的区别
bean 的作用域属性(scope="prototype")如果为 prototype,每次产生新的 bean 实例
bean 的作用域属性(scope="singleton")如果为 singleton,每次返回同一个 bean 实例
Spring框架的五大作用域
singleton、prototype、request、session、global-session
(1)singleton 是默认的作用域,也就是说,当定义 Bean 时,如果没有指定作用域配置项,则 Bean 的作用域被默认为 singleton。
(2)Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。
4Bean的生命周期
Bean 的生命周期可以表达为:Bean 的定义——Bean 的初始化——Bean 的使用——Bean 的销毁
init-method 和 destroy-method
init-method 属性指定一个方法,在实例化 bean 时,立即调用该方法。同样,destroy-method 指定一个方法,只有从容器中移除 bean 之后,才能调用该方法。
5Bean的后置处理器
Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理。
6Bean定义继承
子 bean 的定义继承父定义的配置数据。子定义可以根据需要重写一些值,或者添加其他值。
Spring Bean 定义的继承与 Java 类的继承无关,但是继承的概念是一样的。你可以定义一个父 bean 的定义作为模板和其他子 bean 就可以从父 bean 中继承所需的配置。
Spring 依赖注入
(1)基于构造方法的依赖注入
<bean> <constructor-arg name="" ref=""></constructor-arg> </bean>
(2)基于设值方法的依赖注入
<bean> <property name="" ref=""></property> </bean>
你应该注意定义在基于构造函数注入和基于设值函数注入中的 Beans.xml 文件的区别。唯一的区别就是在基于构造函数注入中,我们使用的是〈bean〉标签中的〈constructor-arg〉元素,而在基于设值函数的注入中,我们使用的是〈bean〉标签中的〈property〉元素。
注入内部 Beans
略
注入集合
略
Spring Bean 自动装配
你已经学会如何使用<bean>
元素来声明 bean 和通过使用 XML 配置文件中的<constructor-arg>
和<property>
元素来注入 。
Spring 容器可以在不使用<constructor-arg>
和<property>
元素的情况下自动装配相互协作的 bean 之间的关系,这有助于减少编写一个大的基于 Spring 的应用程序的 XML 配置的数量。
通过 bean 元素的 autowire 属性可以指定自动装配的模式
模式 | 描述 |
---|---|
no | 这是默认的设置,它意味着没有自动装配,你应该使用显式的bean引用来连线。你不用为了连线做特殊的事。在依赖注入章节你已经看到这个了。 |
byName | 由属性名自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byName。然后尝试匹配,并且将它的属性与在配置文件中被定义为相同名称的 beans 的属性进行连接。 |
byType | 由属性数据类型自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byType。然后如果它的类型匹配配置文件中的一个确切的 bean 名称,它将尝试匹配和连接属性的类型。如果存在不止一个这样的 bean,则一个致命的异常将会被抛出。 |
constructor | 类似于 byType,但该类型适用于构造函数参数类型。如果在容器中没有一个构造函数参数类型的 bean,则一个致命错误将会发生。 |
autodetect | Spring首先尝试通过 constructor 使用自动装配来连接,如果它不执行,Spring 尝试通过 byType 来自动装配。 |
可以使用 byType 或者 constructor 自动装配模式来连接数组和其他类型的集合。
略
Spring 基于注解的配置
开启注解
<context:annotation-config/>
@Required 注解
@Required 注释应用于 bean 属性的 setter 方法,它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中(在XML中为属性赋值),否则容器就会抛出一个 BeanInitializationException 异常。
@Autowired 注解
可以放在三个位置
成员变量前(如:UserDao userDao),构造方法前,设值方法前
在这里做个小结:
我们的spring一步步优化发展,过程如下,分四个阶段:
基于构造方法、基于设值函数、自动装配(byName、byType)、基于注解(@Required、@Autowired)
对比四个阶段的XML配置文件
1 第一阶段时 2 <bean id="" class=""> 3 <constructor-arg ref=""/> 4 </bean> 5 6 第二阶段时 7 <bean id="" class=""> 8 <property name="" ref=""> 9 </bean> 10 11 第三阶段时 12 <bean id="" class="" autowire=""> 13 14 </bean> 15 16 第四阶段时 17 <bean id="" class=""> 18 19 </bean>
@Qualifier 注解
我们有一个类(是一个 Dao),但是在 XML 以它为模板创建了两个对象,但我只想把第一个对象注入到(Service)中,如何做
1 @Autowired 2 @Qualifier("student1") 3 private Student student;