首页 > 其他分享 >SpringBoot启动后获取特定注解的Bean实例代码(转)

SpringBoot启动后获取特定注解的Bean实例代码(转)

时间:2023-04-12 16:45:47浏览次数:48  
标签:容器 SpringBoot 启动 bean public 获取 Bean 注解 event

来自:https://zhuanlan.zhihu.com/p/375973197

本文研究的主要是Spring启动后获取所有拥有特定注解的Bean,具体如下。

最近项目中遇到一个业务场景,就是在Spring容器启动后获取所有的Bean中实现了一个特定接口的对象,第一个想到的是ApplicationContextAware,在setApplicationContext中去通过ctx获取所有的bean,后来发现好像逻辑不对,这个方法不是在所有bean初始化完成后实现的,后来试了一下看看有没有什么Listener之类的,发现了好东西ApplicationListener,然后百度一下ApplicationListener用法,原来有一大堆例子,我也记录一下我的例子好了。

很简单,只要实现ApplicationListener<ContextRefreshedEvent>接口,然后把实现类进行@Component即可,代码如下:

自定义标签:

/**
 * @Author: Q
 * @Date: 2021/4/30 17:07
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Dev {
    @AliasFor(
            annotation = Component.class
    )
    String value() default "";
}

 

 

目标类1:

@Dev
public class ******ServiceImpl

 

 注意,这个事件是在@PostContruct之后的!,所以这里得到的bean不能在@PostContruct方法中调用

/**
 * 启动后加载指定bean ,注意,这个是在@PostContruct之后的!
 * @Author: Q
 * @Date: 2021/5/28 10:33
 */
@Component
public class ContextRefreshedListener implements ApplicationListener<ContextRefreshedEvent> {
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        // 根容器为Spring容器
        if(event.getApplicationContext().getParent()==null){
            Map<String,Object> beans = event.getApplicationContext().getBeansWithAnnotation(Dev.class);
            for (Object bean:beans.values()){
                System.err.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"+bean==null?"null":bean.getClass().getName());
            }
            System.err.println("=====ContextRefreshedEvent====="+event.getSource().getClass().getName());
        }
    }
}

 

其中,通过event.getApplicationContext().getBeansWithAnnotation获取到所有拥有特定注解的Beans集合,然后遍历所有bean实现业务场景。

打印如下:

2021-05-28 11:41:31.152  INFO 26104 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8081 (http) with context path ''
com.***.***.***.service.dict.impl.******ServiceImpl$$EnhancerBySpringCGLIB$$2c7ea6b8
com.***.***.***.service.dict.impl.******ServiceImpl$$EnhancerBySpringCGLIB$$2a000d9b
=====ContextRefreshedEvent=====org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext

 

总结思考:这样的功能可以实现系统参数的初始化,获取系统中所有接口服务清单等一系列需要在Spring启动后初始化的功能。

延生一下:除了以上启动后事件外,还有其他三个事件

Closed在关闭容器的时候调用,Started理论上在容器启动的时候调用,Stopped理论上在容器关闭的时候调用。

标签:容器,SpringBoot,启动,bean,public,获取,Bean,注解,event
From: https://www.cnblogs.com/wangbin2188/p/17310312.html

相关文章

  • springboot中获取指定包下的包含某个注解的全部类(转)
    来自:https://www.cnblogs.com/lexiaoyao1995/p/13943784.html需求获取spring项目里的带有某个注解的全部类难点需要扫描指定包路径下的类,同时也要扫描其下所有子包思路可以自己实现,推荐使用spring的工具类代码packagecom.example.demo;importcom.example.demo.annos......
  • JMeter-BeanShell预处理程序和BeanShell后置处理程序的应用
    一、什么是BeanShell?BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,JMeter性能测试工具也充分接纳了BeanShell解释器,封装成了可配置的BeanShell前置和后置处理器,分别是BeanShellPreprocessor(BeanShell预处理程序)和BeanShellPostprocessor......
  • spring声明式事务(注解)
     xml中开启注解驱动:  ......
  • Springboot LIST进行分割方法
    在开发使用中我们经常会需要把一个LIST按组进行分割,下面记录一下我的使用方法以便以后使用/***LIST进行分割*@paramlist*@paramsubNum*@param<T>*@return*/publicstatic<T>List<List<T>>splistList(List<T>list,int......
  • Springboot集成dubbo完整过程(三)
    准备工作1,准备mysql服务环境2,准备redis服务环境3,准备zookeeper服务环境4,准备逆向生成bean的xml配置文件5,准备slf4j日志xml配置文件6,准备一个sql脚本1,搭建创建服务工程1,创建一个空的父工程,用来统一管理依赖2,创建一个interface接口工程,主要存放业务bean,接口类3,创建一......
  • springboot -eclipse安装springboot插件注意事项
    1.下载包,本地安装,在线安装容易出问题;2.下载的包版本要和eclipse版本一致;3.mac电脑显示和隐藏文件的方法:shift+command+<或者>,分别是显示和隐藏;4.大概率碰到编译报错说找不到org.eclipse.debug.core的问题,第三条就是为了显示隐藏文件,删除/.metadata/.plugins目录下的org.eclipse.......
  • Spring中Bean的实例化详细流程
    还是举个例子,我有一个朋友小汪他远赴南方某城市打工。然后安定下来后他的朋友很想来家里玩,但是呢我这个朋友家里搞的很乱,所以他不好意思请朋友来家里玩。这时我的另一个朋友说那请一个保姆把家里好好整理一下就可以了,然后给他介绍了一个保姆大S(PS:本文无意指向任何人,因为Spring的......
  • 动力节点王鹤SpringBoot3笔记——第七章 视图技术Thymeleaf
    7视图技术ThymeleafThymeleaf是一个表现层的模板引擎,一般被使用在Web环境中,它可以处理HTML,XML、JS等文档,简单来说,它可以将JSP作为JavaWeb应用的表现层,有能力展示与处理数据。Thymeleaf可以让表现层的界面节点与程序逻辑被共享,这样的设计,可以让界面设计人员、业......
  • 动力节点SpringBoot3笔记——视图技术Thymeleaf
    7视图技术ThymeleafThymeleaf是一个表现层的模板引擎,一般被使用在Web环境中,它可以处理HTML,XML、JS等文档,简单来说,它可以将JSP作为JavaWeb应用的表现层,有能力展示与处理数据。Thymeleaf可以让表现层的界面节点与程序逻辑被共享,这样的设计,可以让界面设计人员、业......
  • SpringBoot项目启动执行任务的几种方式
    1、直接在启动类下面调用方法@SpringBootApplicationpublicclassTestApplication{publicstaticvoidmain(String[]args){SpringApplication.run(TestApplication.class,args);System.out.println("在启动类添加初始下方法");}}2、使用@P......