zoukankan      html  css  js  c++  java
  • Spring容器中bean实现初始化方法和销毁方法

    三种bean的 初始化和销毁方法:

         第一种,利用@Bean注解中自带的 initMethod()和 destroyMethod()。

    package com.test;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * @Description //TODO
     * @Author GaoX
     * @Date 2020/7/20 11:13
     */
    @Configuration
    public class TestBean {
    
        @Bean(initMethod ="init", destroyMethod = "destroy")
        public Dog createDog(){
            return new Dog();
        }
    
    }

    ====================================================================================

    package com.test;
    
    public class Dog {
    
        public void init() {
            System.out.println("----Dog----afterPropertiesSet two--------");
        }
    
        public void destroy() {
            System.out.println("----Dog----destroy two--------");
        }
    }

    ====================================================================================

    public static void main(String[] args){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TestBean.class);
        System.out.println(context.getBean(Dog.class));
        context.close();
    }

      第二种,实现 InitializingBean和 DisposableBean接口中的 afterPropertiesSet()和 destroy()方法。

    package com.test;
    
    import org.springframework.beans.factory.DisposableBean;
    import org.springframework.beans.factory.InitializingBean;
    
    public class Cat implements InitializingBean, DisposableBean {
        @Override
        public void destroy() throws Exception {
            System.out.println("----Cat----destroy--------");
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("----Cat----afterPropertiesSet--------");
        }
    }

     ====================================================================================

    package com.test;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * @Description //TODO
     * @Author GaoX
     * @Date 2020/7/20 11:13
     */
    @Configuration
    public class TestBean {
    
        //初始化提示和销毁提示 :通过实现接口方法
        @Bean
        public Cat createCat(){
            return new Cat();
        }
    
    }

     ====================================================================================

    public static void main(String[] args){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TestBean.class);
        System.out.println(context.getBean(Cat.class));
        context.close();
    }

      第三种,可以使用JSR250,@PostConstruct(在bean创建完成并且属性赋值完成;来执行初始化方法)和 @PreDestroy(在容器销毁bean之前通知我们进行清理工作)

    package com.test;
    
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    
    public class Apple {
        //初始化注解
        @PostConstruct
        public void init(){
            System.out.println("----Apple----init--------");
        }
        //销毁注解
        @PreDestroy
        public void destroy(){
            System.out.println("----Apple----destroy--------");
        }
    }

     ====================================================================================

    package com.test;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * @Description //TODO
     * @Author GaoX
     * @Date 2020/7/20 11:13
     */
    @Configuration
    public class TestBean {
    
        @Bean
        public Apple createApple(){
            return new Apple();
        }
    
    }

     ====================================================================================

    public static void main(String[] args){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TestBean.class);
        System.out.println(context.getBean(Apple.class));
        context.close();
    }
    从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
    
    注意:@Configuration注解的配置类有如下要求:
    
    @Configuration不可以是final类型;
    @Configuration不可以是匿名类;
    嵌套的configuration必须是静态类。
    一、用@Configuration加载spring
    1.1、@Configuration配置spring并启动spring容器
    1.2、@Configuration启动容器+@Bean注册Bean
    1.3、@Configuration启动容器+@Component注册Bean
    1.4、使用 AnnotationConfigApplicationContext 注册 AppContext 类的两种方法
    1.5、配置Web应用程序(web.xml中配置AnnotationConfigApplicationContext)
    
    二、组合多个配置类
    2.1、在@configuration中引入spring的xml配置文件
    2.2、在@configuration中引入其它注解配置
    2.3、@configuration嵌套(嵌套的Configuration必须是静态类)
    三、@EnableXXX注解
    四、@Profile逻辑组配置
    五、使用外部变量
    
    一、@Configuation加载Spring方法
    1.1、@Configuration配置spring并启动spring容器
    @Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>,作用为:配置spring容器(应用上下文)
    SpringBoot项目初始化
    1、 创建自定义类实现 CommandLineRunner接口,重写run()方法。springboot启动之后会默认去扫描所有实现了CommandLineRunner的类,并运行其run()方法。
    @Component
    @Order(2)   //通过order值的大小来决定启动的顺序
    public class AskForLeave implements CommandLineRunner {
    
        @Override
        public void run(String... args) throws Exception {
            askForLeave();
        }
    
        public void askForLeave(){
            System.out.println("项目启动了,执行了方法");
        }
    }
    2、创建自定义类实现ApplicationRunner 接口,重写run()方法。
    
    @Component
    @Order(3)
    public class Hello implements ApplicationRunner {
        @Override
        public void run(ApplicationArguments args) throws Exception {
    
            hello();
        }
    
        public void hello(){
            System.out.println("项目又启动了,这次使用的是:继承 ApplicationRunner");
        }
    }
    关于二者的区别:
    
    其实并没有什么区别,如果想获取更加详细的参数的时候,可以选择使用ApplicationRunner接口。其参数类型为:ApplicationArguments 。
    
    还有一种方法
    实现ApplicationListener<ContextRefreshedEvent>接口
    
    package bdc.base;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.annotation.Resource;
    
    import org.springframework.context.ApplicationListener;
    import org.springframework.context.event.ContextRefreshedEvent;
    
    import bdc.ws.dao.CommonDao;
    import bdc.ws.entity.RsaKey;
    //@Component  使用这个注解或者采用bean注入<bean id="afterSpringBegin" class="bdc.base.AfterSpringBegin"></bean>
    public class AfterSpringBegin implements
        ApplicationListener<ContextRefreshedEvent> {
    
      @Resource
      private CommonDao commonDao;
      public static final Map<String, RsaKey> KEY_RSA = new HashMap<String, RsaKey>();
    
      @Override
      public void onApplicationEvent(ContextRefreshedEvent event) {
    
        if (event.getApplicationContext().getParent() == null) {
          try {
            List<RsaKey> selectAllRsaKey = commonDao.selectAllRsaKey();
            for (int i = 0; i < selectAllRsaKey.size(); i++) {
              KEY_RSA.put(selectAllRsaKey.get(i).getUserOrg(),selectAllRsaKey.get(i));
            }
          } catch (Exception e) {
            e.printStackTrace();
          }
        }
      }
    
    }
  • 相关阅读:
    202012-2 期末预测之最佳阈值
    [蓝桥杯][2017年第八届真题]k倍区间
    116. 飞行员兄弟
    P1985 [USACO07OPEN]翻转棋 Fliptile S
    P2882 [USACO07MAR]Face The Right Way G
    730. 机器人跳跃问题
    202012-1 期末预测之安全指数
    SpringMVC 的 JDBC 做 增删改查后 一些总结
    22. VUE 的 V-model 修饰符
    21. VUE 的 V-model 指令(双向绑定input)【主要绑定表单】
  • 原文地址:https://www.cnblogs.com/gaomanito/p/9604569.html
Copyright © 2011-2022 走看看