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 见上篇
posted @ 2022-10-06 22:23  桃花雪  阅读(103)  评论(0编辑  收藏  举报