zoukankan      html  css  js  c++  java
  • bean初始化和销毁的几种方式

    Bean生命周期 Bean创建 -->初始化 -->销毁 

    1.自定义Bean初始化 和销毁的方法 

      init-method和destroy-method

      创建Bike类  

    public class Bike {
        public Bike(){
            System.out.println("Bike Constructor...");
        }
        public void init(){
            System.out.println("bike ...init...");
        }
    
        public void destroy(){
            System.out.println("bike ....destroy...");
        }
    }

    配置类 

    @Configuration
    public class MainConfig {
    
        @Bean(initMethod = "init",destroyMethod = "destroy")
        public Bike bike(){
            return new Bike();
        }
    }

    测试 

     @Test
        public void test1(){
            AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(MainConfig.class);
            context.close();
    
        }

    打印结果

    Bike Constructor...
    bike ...init...
    十月 15, 2019 10:05:36 上午 org.springframework.context.support.AbstractApplicationContext doClose
    信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@5c0369c4: startup date [Tue Oct 15 10:05:35 CST 2019]; root of context hierarchy
    bike ....destroy...

     

      对于单实例的bean 可以正常调用初始化和销毁方法 

      对于多实例的bean( @Scope("prototype") )   容器只负责初始化(第一次获取该bean实例时才会创建并初始化) 但不会管理bean ,容器关闭时不会调用销毁方法

      单例懒加载的bean (@lazy)第一次调用时初始化bean 容器会管理 

     2 .实现 InitializingBean 和 DisposableBean 接口 

       afterPropertiesSet() 当beanFactroy 创建好对象,并且把bean所有属性设置好之后,会调用这个方法。

       destroy()  当一个单例bean销毁时 BeanFactory 会调用这个销毁方法 ,       在容器关闭时,应用上下文会销毁所有的单例bean。

    @Component
    public class Bike implements InitializingBean, DisposableBean {
        public Bike(){
            System.out.println("Bike Constructor...");
        }
        //当bean销毁时调用
        public void destroy() throws Exception {
            System.out.println("Bike destroy..");
        }
        //当bean 属性数赋值和初始化是调用
        public void afterPropertiesSet() throws Exception {
            System.out.println("Bike ....afterPropertiesSet...");
        }
    }

     3.  使用JSR250 规则  定义的两个注解 

         @PostConstruct  在bean创建完成 ,且属性复制完成后进行初始化,属于JDK规范的注解 

         @PreDestroy  在bean将被移除之前进行通知,在容器晓辉之前进行清理工作

    @Component
    public class Bike {
        public Bike(){
            System.out.println("Bike Constructor...");
        }
        @PostConstruct
        public void init(){
            System.out.println("Bike...@PostConstruct...");
        }
        @PreDestroy
        public void  destroy(){
            System.out.println("Bike...@@PreDestroy...");
        }
    }

     4.  BeanPostProcessor    bean的后置处理器  ,在bean初始化之前调用进行拦截 ,在bean初始化前进行一些处理工作 

       使用 BeanPostProcessors 实现两个接口   postProcessBeforeInitialization 和 postProcessAfterInitialization

    @Component
    public class TestBeanPostProcessor implements BeanPostProcessor{
    
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            //返回一个对象 (传过来的对象)
            //在初始化方法调用之前进行后置处理
            //init-mothed 调用之前
            System.out.println("postProcessBeforeInitialization..."+beanName+"..."+bean);
            return bean;
        }
          
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            // init-monthod 调用之后 
            System.out.println("postProcessBeforeInitialization..."+beanName+"..."+bean);
            return bean;
        }
    }
    @Configuration
    @ComponentScan("cn.qin")
    public class MainConfig {
    
        @Bean
        public Person person(){
            System.out.println("给容器中添加 Person");
            return new Person();
        }
        @Bean(initMethod = "init",destroyMethod = "destroy")
        public Bike bike(){
            return new Bike();
        }
    
    }

  • 相关阅读:
    TypeScript学习笔记
    Spring基础知识
    Filter基础知识
    如何开发自定义标签
    会话和会话状态
    Servlet转发到JSP页面的路径问题
    JDBC相关知识
    gimp 很强大, 可是不会用
    python 启动文件
    minidnla policy
  • 原文地址:https://www.cnblogs.com/qin1993/p/11676377.html
Copyright © 2011-2022 走看看