Bean的作用域
类别 | 说明 |
---|---|
singleton | 在SpringIOC容器中仅存在一个Bean实例,Bean以单实例的方式存在 |
prototype | 每次调用getBean()时都会返回一个新的实例 |
request | 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于 WebApplicationContext环境 |
session | 同一个HTTP Session共享一个Bean,不同的HTTP Session使用不同的 Bean。该作用域仅适用于WebApplicationContext环境 |
Spring初始化bean或销毁bean时,有时需要作一些处理工作,因此spring可以在创
建和拆卸bean的时候调用bean的两个生命周期方法。
<bean id=“xxx” class=“...Yoo”
init-method=“init”
destory-method=“destroy”/>
当bean被载入到容器的时候调用init
当bean从容器中删除的时候调用 destroy(scope= singleton有效)
web容器中会自动调用,但是main函数或测试用例需要手动调用
Spring容器中Bean的生命周期
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如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization
8. 执行业务处理
9. 如果Bean实现 DisposableBean 执行 destroy
10. 调用<bean destroy-method="customerDestroy"> 指定销毁方法 customerDestroy
代码实现:
Man实体类
public class Man implements BeanNameAware, ApplicationContextAware, InitializingBean, DisposableBean {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("第二步:设置属性");
this.name = name;
}
public Man() {
System.out.println("第一步:Man被实例化了");
}
public void setup(){
System.out.println("第七步:Man被初始化了");
}
public void teardown(){
System.out.println("第十一步:Man被销毁了");
}
@Override
public void setBeanName(String name) {
System.out.println("第三步:设置Bean的名称"+name);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("第四步:了解工厂信息");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("第六步:属性设置后");
}
public void run(){
System.out.println("第九步:执行业务方法");
}
@Override
public void destroy() throws Exception {
System.out.println("第十步:执行Spring的销毁方法");
}
}
MyBeanPostProcessor
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("第五步:初始化前方法..");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("第八步:初始化后方法..");
if("userDao".equals(beanName)){
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 ("save".equals(method.getName())){
System.out.println("权限校验=========");
return method.invoke(bean,args);
}
return method.invoke(bean,args);
}
});
return proxy;
}else {
return bean;
}
}
}
ApplicationContext.xml
<bean id="man" class="demo3.Man" init-method="setup" destroy-method="teardown">
<property name="name" value="张三"></property>
</bean>
<bean class="demo3.MyBeanPostProcessor"/>
测试类:
public class SpringDemo3 {
@Test
public void test2(){
ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
Man man = (Man) applicationContext.getBean("man");
man.run();
applicationContext.close();
}
}
执行结果: