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