三種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(); } } } }