欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring-bean的生命周期

程序员文章站 2022-05-24 18:13:15
...

Bean的生命周期的11个步骤

1.instantiate bean对象实例化

2.populate properties 封装属性

3.如果Bean实现BeanNameAware 执行 setBeanName

4.如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext

5.如果存在类实现 BeanPostProcessor(后处理Bean ,执行postProcessBeforeInitialization

6.如果Bean实现InitializingBean 执行 afterPropertiesSet

7.调用<bean init-method="init"> 指定初始化方法 init

8.如果存在类实现 BeanPostProcessor(处理Bean ,执行postProcessAfterInitialization

9.执行业务处理

10.如果Bean实现 DisposableBean 执行 destroy

11.调用<bean destroy-method="customerDestroy"> 指定销毁方法 customerDestroy

注:其中第五步和第八步相对来讲比较重要

UserService实例化过程:

UserService

public interface UserService {
	void add();
}

UserServiceImpl

public class UserServiceImpl implements UserService,BeanNameAware,ApplicationContextAware,InitializingBean,DisposableBean{
	public String name;
	//构造器装配  【默认装配】
	public UserServiceImpl(){
		System.out.println("第一步:实例化");
	}
	//set注入【默认属性注入】
	public void setName(String name) {
		System.out.println("第二步:属性注入"+name);
		this.name = name;
	}
	//实现BeanNameAware
	@Override
	public void setBeanName(String arg0) {
		System.out.println("第三步:注入配置类的名称"+arg0);
	}
	//实现ApplicationContextAware
	@Override
	public void setApplicationContext(ApplicationContext arg0)
			throws BeansException {
		System.out.println("第四步:注入applicationContext"+arg0);
		
	}
	//实现InitializingBean
	@Override
	public void afterPropertiesSet() throws Exception {
		System.out.println("第六步:属性设置后执行...");
	}
	public void setup(){
		System.out.println("第七步:调用手动设置的初始化方法...");
	}
	
	public void add()
	{
		System.out.println("第九步:执行自己的业务");
	}
	@Override
	public void destroy() throws Exception {
		System.out.println("第十步:调用销毁的方法...");
		
	}
	public void teardown(){
		System.out.println("第十一步:调用手动销毁方法...");
	}
}

MyBeanPostProcessor【包含第五步和第八步】

public class MyBeanPostProcessor implements BeanPostProcessor{
	/**
	 * bean 实例化对象 
	 */
	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanname)
			throws BeansException {
		if("UserService".equals(beanname))
		{
			System.out.println("第五步:初始化之前执行");

		}
		return bean;
	}
	/**
	 * bean 实例化对象 
	 */
	@Override
	public Object postProcessAfterInitialization(final Object bean, String beanname)
			throws BeansException {

		if("UserService".equals(beanname))
		{
			System.out.println("第八步:初始化之后执行");
			//增强类的三种方式:继承   装饰者模式   动态代理
			//动态代理
			Object proxy=Proxy.newProxyInstance(bean.getClass().getClassLoader(),bean.getClass().getInterfaces(),new InvocationHandler() {
				@Override
				public Object invoke(Object proxy, Method method, Object[] args)
						throws Throwable {
					if("add".equals(method.getName()))
					{
						System.out.println("可以进行一些权限校验");
						return method.invoke(bean, args);
					}
					return method.invoke(bean, args);
				}
			});
			return proxy;
		}
		return bean;
	}


}

xml配置

	<!-- bean的生命周期 -->
<bean id="UserService" class="cn.hfits.spring.demo4.UserServiceImpl" init-method="setup" destroy-method="teardown">
	<property name="name" value="麻花藤"></property>
</bean>
<bean class="cn.hfits.spring.demo4.MyBeanPostProcessor"></bean>