java spring常用接口
ApplicationContextAware接口
在某些特殊的情况下,Bean需要实现某个功能,但该功能必须借助于Spring容器才能实现,此时就必须让该Bean先获取Spring容器,然后借助于Spring容器实现该功能。为了让Bean获取它所在的Spring容器,可以让该Bean实现ApplicationContextAware接口。Spring容器会检测容器中的所有Bean,如果发现某个Bean实现了ApplicationContextAware接口,Spring容器会在创建该Bean之后,自动调用该Bean的setApplicationContextAware()方法,调用该方法时,会将容器本身作为参数传给该方法——该方法中的实现部分将Spring传入的参数(容器本身)赋给该类对象的applicationContext实例变量,因此接下来可以通过该applicationContext实例变量来访问容器本身。
@Component public class SpringHelper implements ApplicationContextAware { private static ApplicationContext applicationContext = null; // 非@import显式注入,@Component是必须的,且该类必须与main同包或子包 // 若非同包或子包,则需手动import 注入,有没有@Component都一样 @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if(this.applicationContext == null){ this.applicationContext = applicationContext; } } //获取applicationContext public static ApplicationContext getApplicationContext() { return applicationContext; } //通过name获取 Bean. public static Object getBean(String name){ return getApplicationContext().getBean(name); } //通过class获取Bean. public static <T> T getBean(Class<T> clazz){ return getApplicationContext().getBean(clazz); } //通过name,以及Clazz返回指定的Bean public static <T> T getBean(String name,Class<T> clazz){ return getApplicationContext().getBean(name, clazz); } }
ServletContextAware接口同ApplicationContextAware
ApplicationListener<ContextRefreshedEvent>接口,
spring的ApplicationContext容器内部中的所有事件类型均继承自org.springframework.context.AppliationEvent,容器中的所有监听器都实现org.springframework.context.ApplicationListener接口,并且以bean的形式注册在容器中。一旦在容器内发布ApplicationEvent及其子类型的事件,注册到容器的ApplicationListener就会对这些事件进行处理。 (1)ApplicationEvent继承自EventObject,Spring提供了一些默认的实现,比如:ContextClosedEvent表示容器在即将关闭时发布的事件类型,ContextRefreshedEvent表示容器在初始化或者刷新的时候发布的事件类型 (2)容器内部使用ApplicationListener作为事件监听器接口定义,它继承自EventListener。ApplicationContext容器在启动时,会自动识别并加载EventListener类型的bean,一旦容器内有事件发布,将通知这些注册到容器的EventListener。 (3)ApplicationContext接口继承了ApplicationEventPublisher接口,该接口提供了void publishEvent(ApplicationEvent event)方法定义
@Component public class StartupListener implements ApplicationContextAware, ServletContextAware,InitializingBean, ApplicationListener<ContextRefreshedEvent> { protected Logger logger = LogManager.getLogger(); @Override public void setApplicationContext(ApplicationContext ctx) throws BeansException { logger.info("1 => StartupListener.setApplicationContext"); } @Override public void setServletContext(ServletContext context) { logger.info("2 => StartupListener.setServletContext"); } @Override public void afterPropertiesSet() throws Exception { logger.info("3 => StartupListener.afterPropertiesSet"); } @Override public void onApplicationEvent(ContextRefreshedEvent evt) { logger.info("4.1 => MyApplicationListener.onApplicationEvent"); if (evt.getApplicationContext().getParent() == null) { logger.info("4.2 => MyApplicationListener.onApplicationEvent"); } } }
SmartLifecycle 接口
说明:Spring 的IOC是我们最常用到的功能,能帮我们管理bean。但是我们有时需要在bean全部加载和初始化完毕之后,再做一些事情。这个接口就可以满足我们的需求。
SmartLifecycle 是一个接口。当Spring容器加载所有bean并完成初始化之后,会接着回调实现该接口的类中对应的方法(start()方法)。
@Configuration
public class DriverManageConfig implements SmartLifecycle {
private final Logger log = LoggerFactory.getLogger(this.getClass());
private volatile boolean running;
@Override
public void start() {
if (running) {
return;
}
TriggerDriverRunThread.instance().start();
TriggerContainerRunThread.instance().start();
TriggerContainerStatusThread.instance().start();
running = true;
}
@Override
public void stop() {
running = false;
TriggerDriverRunThread.instance().stop();
TriggerContainerRunThread.instance().stop();
TriggerContainerStatusThread.instance().toStop();
}
/**
* 1. 只有该方法返回false时,start方法才会被执行。
* 2. 只有该方法返回true时,stop(Runnable callback)或stop()方法才会被执行。
*/
@Override
public boolean isRunning() {
return this.running;
}
}
ApplicationRunner 接口
springboot项目在启动的时候,有时候需要在启动之后直接执行某一些代码
import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; /** * springboot项目在启动的 * 时候,有时候需要在启动之 * 后直接执行某一段代码 */ @Component @Order(1) public class MyApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { System.out.println("在springboot启动之后,我被MyApplicationRunner类调用了"); } }
此外经常用到的还用bean生命周期接口: InitialzingBean,DisposableBean 见上篇