spring框架提供了接口来自定义Bean的性质,包含
- 生命周期回调
- ApplicationContextAware和BeanNameAware
- 其它Aware接口
1、生命周期回调
1.1 初始化回调
实现InitializingBean接口。
不推荐使用,因为存在耦合。建议使用@PostConstruct注解或者基于xml时使用init-method属性指定初始化方法
1.2 销毁回调
实现DisposableBean接口。
推荐使用@PreDestroy或者xml配置时的destroy-method属性来指定
1.3 默认的初始和销毁方法
使用default-init-method属性来指定将bean的方法名默认为初始化方法
使用default-destroy-method属性来指定将bean的方法名默认为销毁方法
1.4 组合生命周期机制
在同时有InitializingBean、DisposableBean、init()和destroy()方法和@PostConstruct、@PreDestroy时。
初始化时调用顺序为
@PostConstruct->InitializingBean->init()
销毁时调用顺序为@PreDestroy->DisposableBean->destroy()
1.5 启动和关闭回调
实例Lifecycle、LifecycleProcessor或者SmartLifecycle接口。
在AbstractApplicationContext的refresh()方法中会调用finishFresh来调用启动的回调
1.6 优雅关闭spring ioc容器
通过调用registerShutdownHook(ConfigurableApplicationContext接口有定义)来注册关闭钩子
2、ApplicationContextAware和BeanNameAware
AppicationContextAware通过ApplicationContextAwareProcessor来处理,在AbstractAppicationContext的prepareBeanFactory加入的。其主要处理EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationStartupAware和ApplicationContextAware。其处理是在CommonAnnotationPostProcessor之后
BeanNameAware是在AbstractAutowireCapableBeanFactory中的initializeBean来处理的,会处理BeanNameAware、BeanClassLoaderAware和BeanFactoryAware,其是在@PostConstruct之前处理。