1.Spring IoC容器可以创建、装配和配置应用组件对象,此处组件对象称为Bean(数据源、事务管理器...)
Bean的配置(XML文件):XML文件中根元素是<beans>,<beans>中包含多个<bean>子元素,每个<bean>元素定义一个Bean,并描述Bean如何被装配到Spring容器之中
id | Bean在BeanFactory中的唯一标识,在代码中通过BeanFactory获取Bean实例时,需要借此作为索引名称 |
class | Bean的具体实现类,使用的类的名字 |
Bean实例化:Spring框架中如果想要使用Bean,需要先实例化Bean
Spring实例化三种方式:构造方法实例化、静态工厂实例化、实例工厂实例化(其中常用方法是构造方法实例化)
a.构造方法实例化:Spring调用Bean对应类中的无参数构造方法来实例化Bean
b.静态工厂实例化:开发者在工厂类中需要创建一个静态方法来创建Bean的实例,在配置Bean时,class属性需要指定静态工厂类,同时还需要使用factory-method属性来指定工厂类中的静态方法
c.实例工厂实例化:开发者在工厂类中需要创建一个实例方法来创建Bean的实例,在配置Bean时,需要使用factory-bean属性指定配置的实例工厂,同时还需要使用factory-method属性指定实力工厂中的实例方法
2.Bean的作用域
singleton | 默认的作用域,使用此定义的Bean在Spring容器中将只有一个Bean实例 |
prototype | Spring容器每次获取prototype定义的Bean,容器都将创建一个新的Bean实例 |
singleton作用域(默认作用域)
配置文件可以写成
<bean id="xxx" class="xxx" > //scope默认为singleton
<bean id="xxx" class="xxx" scope="singleton"> //指定范围为singleton
使用id或name获取Bean实例时,IoC容器返回的始终是同一个Bean实例
prototype作用域:
配置文件<bean id="xxx" class="xxx" scope="prototype">
每次使用id或name获取Bean实例时,返回的都是不同的Bean实例
3.Bean的生命周期
a.根据Bean配置情况实例化一个Bean
b.根据Spring上下文对实例化的Bean进行依赖注入(即对Bean的属性进行初始化)
c.根据Bean实现的接口(BeanNameAware/BeanFactoryAware/ApplicationContextAware/BeanPostProcessor/InitializingBean...),调用对应的方法,完成对应的操作
d.如果实现了DisposableBean接口,则调用其实现的destory方法将Spring中的Bean销毁
如果在配置文件中通过了destory-method属性指定了Bean的销毁方法,将调用配置其配置的销毁方法进行销毁
整个生命周期:实例化——初始化——接受请求——销毁
4.Bean的装配方式
将Bean的依赖注入到Spring中,Bean的装配方式即Bean的依赖注入方式
Spring容器支持XML配置的装配、基于注解的装配、自动装配等多种装配方式
基于XML配置的装配:a.使用构造方法注入;b.使用属性的setter方法注入
a.构造方法注入:Bean的实现类需要提供带参数的构造方法,并在配置文件中使用<bean>元素的子元素<constructor-arg>来定义构造方法的参数;
b.属性的setter方法注入:Bean的实现类需要提供一个默认无参数的构造方法,并为需要注入的属性提供对应的setter方法,另外需要使用<bean>元素的子元素<property>为每个属性值注入值
基于注解的装配(应用中Bean对象过多的话,使用基于XML配置的装配会导致XML配置文件过大):
@Component | 一个泛化的概念,仅表示一个组件对象(Bean)可以作用在任何层次上 创建Bean的实现类 @Component() //相当于@Component("annotationUser")或@Component(value="annotationUser") public class AnnotationUser{ } |
@Repository | 用于将数据访问层(DAO)的类标识为Bean,即注解数据访问层,功能与@Component相同 |
@Service | 用于标注一个业务逻辑组件类(Service层),其功能与@Component相同 |
@Controller | 用于标注一个控制器组件类(Spring MVC的Controller),其功能与@Component相同 |
@AutoWired | 该注解可以对类成员变量、方法、构造方法进行标注,完成自动装配的工作,通过使用@AutoWried消除setter和getter方法,默认按照Bean的类型进行装配 |
@Resource | 注解与@AutoWired功能一样,区别在于此注解默认是按照名称来装配注入,只有找不到与名称匹配的Bean才会按照Bean类型来进行装配注入;@AutoWried默认按照Bean的类型来进行装配(若要按照名称来进行装配注入,则需要与@Qualifier一起使用) @Resource注解有两个属性——name和type,name属性指定Bean实例名称(按照名称来进行装配注入),type指定Bean类型(按照Bean类型来进行装配注入) |