Spring注解专题系类二

9次阅读

共计 3272 个字符,预计需要花费 9 分钟才能阅读完成。

Spring 注解应用篇 –IOC 容器 Bean 生命周期

这是 Spring 注解专题系类文章,本系类文章适合 Spring 入门者或者原理入门者,小编会在本系类文章下进行企业级应用实战讲解以及 spring 源码跟进。
本文来自公众号:B 一下爪哇

环境准备

  • 编译器 IDEA
  • maven 依赖 spring-context version:4.3.12.RELEASE
  • maven 依赖 junit version:4.11

Bean 注解来指定 bean 初始化和销毁方法

前面一章提过,在配置类中通过 @Bean 来将组件注入到容器中,在容器中,Bean 的生命周期大抵上可以分为创建 – 初始化 – 销毁的过程,容器管理着组件的全部生命周期。Bean 注解源码里面包含 initMethod 和 destroyMethod 两个属性,可以分别来自定义 bean 的初始化方法和销毁方法。
自定义格式:

@Bean(initMethod=,destoryMethod=)

测试:
先在 Bean 中自定义初始化和销毁方法:

public class ExampleBean {
    private String name;
    private int age;
.....
public void init(){System.out.println("ExampleB init...");
    }
    public void destory(){System.out.println("Example destory...");
    }
}

配置类:

@Configuration
public class BaseConfig {@Bean(value="beanIdDefinition",initMethod = "init",destroyMethod = "destory")
    public ExampleBean exampleBean(){return new ExampleBean();
    }
}

测试类:

@Test
    public void shouldAnswerWithTrue()
    {AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(BaseConfig.class);
        System.out.println("IOC 容器创建完成...");
        String[] beanDefinitionNames = ctx.getBeanDefinitionNames();
        ctx.close();}

output:

exampleBean constructor......
ExampleB init...
IOC 容器创建完成...
Example destory...

由此可知,在容器初始化过程中已经完成对 bean 的初始化工作,并且在容器关闭途中,调用 bean 的销毁方法。(下一章分析容器初始化大致做了哪一些工作)

InitializingBean 和 DisposableBean 接口指定 Bean 初始化和销毁方法

InitializingBean 的 afterPropertiesSet 在设置提供 Bean 的属性值后由 BeanFactory 调用进行方法调用。
DisposableBean 的 destory 在 Bean 单例被破坏时由 BeanFactory 进行方法调用。
定义 Bean 并实现这两个接口

public class LifeCycleBean implements InitializingBean, DisposableBean{
    @Override
    public void afterPropertiesSet() throws Exception {System.out.println("LifeCycleBean afterPropertieSet....");
    }

    @Override
    public void destroy() throws Exception {System.out.println("LifeCycleBean destory....");
    }
}

output:

LifeCycleBean afterPropertieSet....
IOC 容器创建完成...
LifeCycleBean destory....

PostConstruct & PreDestory 注解

JSR 是 Java Specification Requests 的缩写,意思是 Java 规范提案。
JSR250 已经添加至 Java SE6 中,常用的大概就是 PostConstruct 初始化、PreDestory 销毁、Resource 资源等。
Spring 支持 JSR250 的注解。PostConstruct 在 bean 创建完成并且属性赋值完成;来执行初始化方法;PreDestory 在容器销毁 bean 之前回调通知;Resource 支持 bean 自动装配,类似 Autowired。
使用方式,在 Bean 中直接添加:

@PostConstruct
    public void initPost(){System.out.println("ExampleBean JSR250 PostConstruct...");
    }

    @PreDestroy
    public void destoryPre(){System.out.println("ExampleBean JSR250 PreDestory...");
    }

测试 output:

exampleBean constructor......
ExampleBean JSR250 PostConstruct...
IOC 容器创建完成...
ExampleBean JSR250 PreDestory...

BeanPostProcessor 后置处理器

BeanPostProcessor【接口】:bean 后置处理器在 Bean 的生命周期起到一个承上启下的作用,在 Bean 初始化前后进行处理工作。

  • PostProcessorBeforeInitialization 方法:在初始化方法调用之前调用;
  • postProcessorBefore 方法:在 bean 初始化方法调用之后工作

两个方法都包含 2 个相同的参数:
@param Object o:Bean 实例
@param String s:beanName

定义一个 Bean 实现后置处理器接口:

public class BeanPostProcessorDefinition implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {System.out.println("postProcessBeforeInitialization -->"+s+"="+o);
        return o;
    }

    @Override
    public Object postProcessAfterInitialization(Object o, String s) throws BeansException {System.out.println("postProcessorAfterInitialization -->"+s+"="+o);
        return o;
    }
}

以容器中存在的 id 为 exampleBean 的 bean 为例:查看 output:

// 部分容器初始化的一些 bean
exampleBean constructor......
postProcessBeforeInitialization -->exampleBean = ExampleBean{name='null', age=0}
ExampleBean JSR250 PostConstruct...
postProcessorAfterInitialization -->exampleBean=ExampleBean{name='null', age=0}
IOC 容器创建完成...

由此不难得出,在容器初始化过程中,大致依次完成 bean 的创建,实例化,属性赋值,执行 bean 后置处理器初始化之前的方法,执行初始化方法,执行 bean 后置处理器初始化之后的方法。

正文完
 0