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>