通过本文主要向大家介绍了spring bean生命周期,spring中bean的作用域,spring 获取bean,spring中bean是什么,spring boot bean等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
前言
在applicationContext.xml中配置完bean之后,Bean的声明周期状态有哪些。生命周期的各个阶段可以做什么。在applicationContext.xml配置bean的作用域有哪些。其中各个作用域代表的是什么。适用于什么情况。这篇文章做一个记录。
生命周期
初始化
可以直接查看图片,图片来自Spring Bean Life Cycle
从上图看出,Bean初始化完成包括9个步骤。其中一些步骤包括接口的实现,其中包括BeanNameAware接口,BeanFactoryAware接口。ApplicationContextAware接口。BeanPostProcessor接口,InitializingBean接口。那么这些接口在整个生命周期阶段都起到什么作用?后面我们一一介绍。
实例化前
当Bean全部属性设置完毕后,往往需要执行一些特定的行为,Spring提供了两种方式来实现此功能:
- 使用init-mothod方法
- 实现initializingBean接口
指定初始化方法
如下:
package com.model; public class InitBean { public static final String NAME = "mark"; public static final int AGE = 20; public InitBean() { // TODO Auto-generated constructor stub System.out.println("执行构造方法"); } public String name; public int age ; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void init(){ System.out.println("调用init方法进行成员变量的初始化"); this.name = NAME; this.age = AGE; System.out.println("初始化完成"); } }</div>
编写加载器
package com.model; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.service.UserServiceImpl; public class Main { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("initbean.xml"); InitBean bean = (InitBean) context.getBean("init"); } }</div>
配置Bean
注意init-method参数
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="init" class="com.model.InitBean" init-method="init"/> </beans></div>
执行结果
实现InitializingBean接口
实现InitializingBean接口会实现afterPropertiesSet方法,这个方法会自动调用。但是这个方式是侵入性的。一般情况下,不建议使用。
实现afterPropertiesSet方法
package com.model; import org.springframework.beans.factory.InitializingBean; public class InitBean implements InitializingBean { public static final String NAME = "mark"; public static final int AGE = 20; public InitBean() { // TODO Auto-generated constructor stub System.out.println("执行构造方法"); } public String name; public int age ; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void init(){ System.out.println("调用init方法进行成员变量的初始化"); this.name = NAME; this.age = AGE; System.out.println("初始化完成"); } @Override public void afterPropertiesSet() throws Exception { // TODO Auto-generated method stub System.out.println("调用init方法进行成员变量的初始化"); this.name = NAME; this.age = AGE; System.out.println("初始化完成"); } }</div>
配置xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- <bean id="init" class="com.model.InitBean" init-method="init"/> --> <bean id="init" class="com.model.InitBean" init-method="init"/> </beans></div>
结果:
销毁
同样,上图中表示来Bean销毁时候的过程。包括DisposableBean接口。
使用destroy-method方法
package com.model; import org.springframework.beans.factory.InitializingBean; public class InitBean implements InitializingBean { public static final String NAME = "mark"; public static final int AGE = 20; public InitBean() { // TODO Auto-generated constructor stub System.out.println("执行构造方法"); } public String name; public int age ; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void init(){ System.out.println("调用init方法进行成员变量的初始化"); this.name = NAME; this.age = AGE; System.out.println("初始化完成"); } @Override public void afterPropertiesSet() throws Exception { // TODO Auto-generated method stub System.out.println("调用init方法进行成员变量的初始化"); this.name = NAME; this.age = AGE; System.out.println("初始化完成"); } public void close(){ System.out.println("bean被销毁"); } }</div>
配置Bean
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- <bean id="init" class="com.model.InitBean" init-method="init"/> --> <bean id="init" class="com.model.InitBean" destroy-method="close"/> </beans></div>
配置加载器
package com.model; import org.springframework.context.ApplicationContext; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.service.UserServiceImpl; public class Main { public static void main(String[] args) { AbstractApplicationContext context = new ClassPathXmlApplicationContext("initbean.xml"); context.registerShutdownHook(); InitBean bean = (InitBean) context.getBean("init"); } }</div>