前言
Spring是分层的 Java SE/EE应用full- stack轻量级开源框架,以IoC(Inversion of Control:反转控制)和AOP( Aspect Oriented Programming:面向切面编程)为内核,提供了展现层 Spring MVC和持久层 Spring JDBC以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的 Java EE企业应用开源框架。
Spring Bean的初始化
Bean初始化(Initialization)
- @PostConstruct标准方法
public interface UserFactory {
default User createUser(){
return User.createUser();
}
}
public class DefaultUserFactroy implements UserFactory {
//1.基于@PostConstruct注解
@PostConstruct
public void init(){
System.out.println("@PostConstruct: UserFactroy 初始化中。。。。");
}
}
@Configuration
public class BeanInitalizationDemo {
public static void main(String[] args) {
//创建BeanFactory容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
//注册Configuration class(配置类)
applicationContext.register(BeanInitalizationDemo.class);
//启动Spring应用上下文
applicationContext.refresh();
//依赖查找UserFactory
UserFactory userFactory = applicationContext.getBean(UserFactory.class);
//关闭Spring应用上下文
applicationContext.close();
}
@Bean
public UserFactory userFactory(){
return new DefaultUserFactroy();
}
}
- 实现InitialingBean接口的afterPropertiesSet()方法
public class DefaultUserFactroy implements UserFactory, InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("InitializingBean#afterPropertiesSet(): UserFactroy 初始化中。。。。");
}
}
- 自定义初始化方法
- XML配置:<bean init-method="init" .../>
- Java注解:@Bean(initMethod=“init”)
@Bean(initMethod = "initUserFactory") public UserFactory userFactory(){ return new DefaultUserFactroy(); }
- Java API:AbstractBeanDefinition#setInitMethodName(String)
输出顺序为:@PostConstruct->InitializingBean->自定义的initUserFactory
Spring Bean的延迟初始化
Bean延迟初始化(Initialization)
非延迟初始化在Spring应用上下文启动完成后,被初始化;延迟初始化在Bean被调用的时候,进行初始化;
- XML配置:<bean lazy-init="true" .../>
- Java注解:@Lazy(true)
@Bean(initMethod = "initUserFactory")
@Lazy
public UserFactory userFactory(){
return new DefaultUserFactroy();
}
Spring Bean的销毁
Bean销毁(destory())
- @PreDestory标注方法
@PreDestroy public void perDestroy(){ System.out.println("@PreDestroy: UserFactroy 销毁中。。。。"); }
- 实现DisposableBean接口的destory方法
public class DefaultUserFactroy implements UserFactory, DisposableBean { @Override public void destroy() throws Exception { System.out.println("DisposableBean#destroy(): UserFactroy 销毁中。。。。"); } }
- 自定义销毁方法
- XML配置:<bean destroy="destroy" .../>
- Java注解:@Bean(destroy="destory")
public void doDestroy(){ System.out.println("自定义doDestroy(): UserFactroy 销毁中。。。。"); } @Bean(initMethod = "initUserFactory",destroyMethod = "doDestroy") public UserFactory userFactory(){ return new DefaultUserFactroy(); }
- Java API: AbstractBeanDefinition#setDestroyMethodName(String)
输出顺序为:@PreDestory->DisposableBean->自定义的doDestroy
垃圾回收(GC())
- 关闭spring容器(应用上下文)
- 执行GC
- Spring Bean覆盖的finalize()方法 被回调