1.6.1 生命周期回调
实现接口:
InitializingBean
DisposableBean
可以使用afterPropertiesSet() 和destroy() 执行特定的功能。
JSR-250 规定使用@PostConstruct and @PreDestroy注解,但是这个不会与spring的特定接口结合。也就是不会走到Spring的特定接口。
Spring 使用 BeanPostProcessor ,
-初始化回调
org.springframework.beans.factory.InitializingBean
void afterPropertiesSet() throws Exception;
不推荐使用InitializingBean 的接口,因为会与Spring进行不必要的耦合。使用 @PostConstruct 或者指定POJO指定方法。
xml使用 init-method, Java使用 intiMethod
<bean id="exampleInitBean" class="examples.ExampleBean" init-method="init"/>
public class ExampleBean {
public void init() {
// do some initialization work
}
}
}
虽然与以下等效,但是不会与Spring耦合
<bean id="exampleInitBean" class="examples.AnotherExampleBean"/>
public class AnotherExampleBean implements InitializingBean {
public void afterPropertiesSet() {
// do some initialization work
}
}
}
-销毁回调
org.springframework.beans.factory.DisposableBean
void destroy() throws Exception;
不建议使用DisposableBean 回调接口,应为会和Spring有不必要的耦合。
可以使用@PreDestroy , 在XML中bean配置 destroy-method
<bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/>
在Java中, 使用Bean中的destroyMethod.
<bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/>
public class ExampleBean {
public void cleanup() {
// do some destruction work (like releasing pooled connections)
}
}
}
与以下等效:以下方式不好,与Spring 耦合
<bean id="exampleInitBean" class="examples.AnotherExampleBean"/>
public class AnotherExampleBean implements DisposableBean {
public void destroy() {
// do some destruction work (like releasing pooled connections)
}
}
}
-默认初始和销毁方法
可以指定初始化的方法:
<beans default-init-method="init">
<bean id="blogService" class="com.foo.DefaultBlogService">
<property name="blogDao" ref="blogDao" />
</bean>
</beans>
代码中新增这个方法:
public class DefaultBlogService implements BlogService {
private BlogDao blogDao;
public void setBlogDao(BlogDao blogDao) {
this.blogDao = blogDao;
}
// this is (unsurprisingly) the initialization callback method
public void init() {
if (this.blogDao == null) {
throw new IllegalStateException("The [blogDao] property must be set.");
}
}
}
}
同样销毁可以使用 default-destroy-method 的配置
对同一个bean的多个生命周期机制,可以使用不同的初始化方法,顺序如下
1- @PostConstruct 的注释
2- afterPropertiesSet() 定义在InitializingBean 接口的
3. 定制的 init() 方法
销毁的顺序也是类似:
1. @PreDestroy 注释
2. destroy() 方法 继承自DisposableBean
3.定制的destroy() 方法。
在依赖项开始之前开始,在依赖项结束之后结束。
SmartLifecycle接口,可以得到对象的阶段。
Spring web 的ApplicationContext已经处理了关闭Spring IoC 容器。
非web应用程式需要处理。
registerShutdownHook()
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public final class Boot {
public static void main(final String[] args) throws Exception {
ConfigurableApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
// add a shutdown hook for the above context...
ctx.registerShutdownHook();
// app runs here...
// main method exits, hook is called prior to the app shutting down...
}
}
}
1.6.2 ApplicationContextAware 和 BeanNameAware
从ApplicationContextAware接口继承,当创建一个ApplicationContext是,提供了以下设置方式:
public interface ApplicationContextAware {
void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
}
}
BeanNameAware 类似状况
public interface BeanNameAware {
void setBeanName(String name) throws BeansException;
}
}
1.6.3 其他Aware接口
Name
Injected Dependency
Explained in…
ApplicationContextAware
Declaring ApplicationContext
ApplicationContextAware and BeanNameAware
ApplicationEventPublisherAware
Event publisher of the enclosing ApplicationContext
Additional capabilities of the ApplicationContext
BeanClassLoaderAware
Class loader used to load the bean classes.
Instantiating beans
BeanFactoryAware
Declaring BeanFactory
ApplicationContextAware and BeanNameAware
BeanNameAware
Name of the declaring bean
ApplicationContextAware and BeanNameAware
BootstrapContextAware
Resource adapter BootstrapContext the container runs in. Typically available only in JCA aware ApplicationContexts
JCA CCI
LoadTimeWeaverAware
Defined weaver for processing class definition at load time
Load-time weaving with AspectJ in the Spring Framework
MessageSourceAware
Configured strategy for resolving messages (with support for parametrization and internationalization)
Additional capabilities of the ApplicationContext
NotificationPublisherAware
Spring JMX notification publisher
Notifications
ResourceLoaderAware
Configured loader for low-level access to resources
Resources
ServletConfigAware
Current ServletConfig the container runs in. Valid only in a web-aware SpringApplicationContext
Spring MVC
ServletContextAware
Current ServletContext the container runs in. Valid only in a web-aware SpringApplicationContext
Spring MVC
Aware的用法没有follow IoC的风格。
- 空白目录
- 0.环境准备
- 0.1基于maven的工程创建
- 1.控制反转容器
- 1.1 Spring控制反转容器和beans介绍
- 1.2 容器概览
- 1.3 Bean概览
- 1.4 依赖
- 1.5 Bean的范围
- 1.6 客制bean的特性
- 1.7 Bean定义的继承
- 1.8 容器扩展点
- 1.9 基于注解的容器配置
- 1.10 类路径扫描及组件管理
- 1.11 使用JSR 330标准的注解
- 1.12 基于Java的容器配置
- 1.12.1 基本概念: @Bean 和 @Configuration
- 1.13 环境抽象化
- 1.14 注册一个LoadTimeWeaver
- 1.15 ApplicationContext的附加功能
- 1.16 BeanFactory
- 2. 资源
- 3. 验证,数据绑定和类型转换
- 4. Spring表达式语言(SpEL)
- 5. Spring面向方面的切面编程
- 6. Spring AOP 接口
- 7. 空安全
- 8. 数据缓冲和编码
- 9. 附录