Spring Bean深入剖析(三)

前言

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配置:
    • 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配置:
  • 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配置:
    • 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()方法 被回调

你可能感兴趣的:(Spring Bean深入剖析(三))