SpringBean(配置、实例化、作用域、生命周期、装配方式)
Bean的配置
Spring相当于一个大型的工厂,用于生产和管理Spring容器中的Bean。如果要使用这个工厂生产和管理Bean,需要开发者将Bean配置在Spring的配置文件中。
有两种配置方式:
(1)XML格式的配置 | 在实际开发中常用 |
(2)Properties |
Bean的实例化
在面向对象编程中,如果想使用某个对象,需要先实例化该对象。
Spring框架实例化Bean有三种方式:
(1)构造方法实例化:Spring容器可以调用Bean对应类中的无参构造方法来实 例化Bean。
**(2)静态工厂实例化:**使用时要求开发者在工厂类中创建一个静态方法来创建Bean实例。在配置Bean时,class属性定义静态工厂类,同时还要需要使用factory-method属性指定工厂中的静态方法。
**(3)实例化工厂实例化:**使用时要求开发者在工厂类中创建一个实例方法来创建Bean的实例。在配置Bean时,需要使用factory-bean属性指定配置的实例工厂,同时还需要factory-method属性指定实例工厂中的实例方法。
Bean的作用域
Spring5.0中为Bean的实例定义了作用域。如下图:
在表中的6中作用域中,singleton和prototype是最常用的两种。
Bean的生命周期
一个对象的生命周期包括创建(实例化与初始化)、使使用以及销毁等阶段,在 Spring中, Bean 对象周期也遵循这一过程,但是 Spring 提提供了许多对外接口,允许开发者对三个过程(实例化、初始化、销毁)的前后做一些操作作。在 Spring Bean 中,实例化是为 Bean对象开辟空间,初始化则是对属性的初始化.
Spring 容器可以管理 singleton 作用域 Bean 的生命周期,在此作用域下, Spring 能
精确地知道 Bean 何时战创建,何时初始化完成,以及及何时被销毁。而对于prototype 作的的 Bean , Spring 只负责创建,当容器创建了 Bean 的实实例后, Bean 实例就交给了客户 N 的代码管理, Spring 容器将不再跟踪其生命周期,并且组不会管理那些被配置成 prototype 作脚城的 Bean . Spnng 中 Bean 的生命周期的执行是一个很复杂复杂的过程,可借鉴 Servlet 的生命周期“实例化一初始化( init )一接收请求( service )一销销毁( destroy )”来理解 Bean 的生命周期。
Bean 的生命周期的整个过程如下:
( I )根据 Bean 的配置情况实例化一个 Bean 。
(2)根据 Spring 上下文对实例化的 Bean 进行行依赖注入,即对 Bean 的属性进行初
始化。
(3)如果 Bean 实现了 BeanNameAware 接口,将调用它实现的 setBeanName ( String bcanld )方法,此处参数传递的是 Spring 配配置文件中 Bcan 的 id 。
(4)如果 Bean 实了 BeanFactoryAware 接口,将调用它实现的 settBeanFactory 方法,此处参数传递的是当前 Spring 工厂实例的的引用。
(5)如果 Bean 实现了 ApplicationCiContextAware 按口,将调用它实现的 setApplicationContext(ApplicationContext )方法,此处参数传递的是 Spring 上下文实例的引用。
(6)如果 Bean 关联了 BeanPostProcessor 接口,将调用初初始化方洗postProcess
BeforelnitializationfObject obj , Strirings )对 Bean 进行操作。
(7)如果 Bean 实现了 InitializingBeanin 接口,将调用 afterPropertiesSet 方法。
(8)如果 Bean 在 Spring 配置文件中配置了 init - method 属性,将自动调用其配置的初始化方法。
(9)如果 Bean 关联了 BeanPostProcesassor 接口,将调用postProcessAfteterInitializat0l( Object obj , String s )方法,由于是在 Bean 初初始化结東时调用 After 方法,也可用于内存或缓存技术。
注意:以上工作完成后就可以使用该 Bean ,由于该 Bean 的作用城是 singleton ,所以调用的是同一个Bean实施。
(10)当 Bean 不再需要时将进入销毁阶段,如如果 Bean 实现了 DisposableBean 接口,则调用其实现的 destroy 方法将 Springng 中的 Bean 销毀。
(11)如果在配置文件中通过 destroy - method 属性指定了 Bean 的销毁方法,将调用其配置的销毁方法进行销毁。
在 Spring 中,通过实现特定的接口或通过< bean >元素的属性设置可以对 Bean 的生命周期过程产生影响。开发者可以随意地配置< bean >元素的属性,但不建议过多地使用 Bean 实现接口,因为这样将使代码和 Spring 聚合比较紧密。
Bean的装配方式
Bean的装配方式(即Bean的依赖注入的方式),大体分为两种:
Bean的装配方式 |
|
(1) | 基于XML的配置的装配 |
(2) | 基于注解的装配 |
为什么基于注解的装配是常用的?
尽管XML可以简单的装配Bean,但是如果有大量的Bean需要装配,会导致XML文件过于庞大,不方便以后的升级与维护。
接下介绍基于注解装配的七种常用注解,以及应用位置
(1)@Component
该注解是一个泛化的概念,仅仅表示一个组件对象(Bean),可以作用在任何层次上。
(2)@Repository
该注解用于将数据访问层(Dao层)的类标识为Bean,即注解数据访问层Bean,其功能与@Componet相同
(3)@Service
该注解用于标注一个业务逻辑组件类(Service层),其功能与@Component相同
(4)@Controller
该注解用于标注一个控制器组件类(SpringMVC的Controller),其功能与@Componet相同
(5)@Autowired
该注解可以对类成员变量、方法及构造方法进行标注,完成自动装配的功能。通过使用@Autowired来消除setter和getter方法。默认按照Bean的类型进行装配。
(6)@Resource
该注解与@Autowired的功能一样,区别在于该注解默认是按照名称来装配的,只有当找不到与名称匹配的Bean时才会按照类型来装配注入;而@Autowired默认按照Bean的类型进行装配,如果想按照名称来装配注入,则需要和@Qualifier注解一起使用。
@Resource注解有两个属性—name和type。name属性指定Bean实例名称,即按照名称来装配注入;type属性指定Bean类型,即按照Bean的类型进行装配。
(7)@Qualifier
该注解与@Autowired注解配合使用。当@Autowired注解需要按照名称来装配注入时,需要和该注解一起使用,Bean的实例名称由@Qualifier注解的参数指定。