最近项目中遇到一个业务场景,就是在Spring容器启动后获取所有的Bean中实现了一个特定接口的对象,第一个想到的是ApplicationContextAware,在setApplicationContext中去通过ctx获取所有的bean,后来发现好像逻辑不对,这个方法不是在所有bean初始化完成后实现的,后来试了一下看看有没有什么Listener之类的,发现了好东西ApplicationListener,然后百度一下ApplicationListener用法,原来有一大堆例子,我也记录一下我的例子好了。
很简单,只要实现ApplicationListener<ContextRefreshedEvent>接口,然后把实现类进行@Component即可,代码如下:
@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(IMobile.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实现业务场景。
总结思考:这样的功能可以实现系统参数的初始化,获取系统中所有接口服务清单等一系列需要在Spring启动后初始化的功能。
延生一下:除了以上启动后事件外,还有其他三个事件
Closed在关闭容器的时候调用,
Started理论上在容器启动的时候调用,
Stopped理论上在容器关闭的时候调用。
我通过TomcatServer进行启动停止,只看到了Refreshed和Closed,不知道为啥,有空再继续研究
相关推荐
Spring启动后获取所有拥有特定注解的Bean实例代码 Spring框架中,获取所有拥有特定注解的Bean实例代码是非常重要的一个功能,特别是在系统参数初始化、获取系统中所有接口服务清单等一系列需要在Spring启动后初始...
2. **AOP(面向切面编程)**:通过Spring AOP,可以在特定的切点(如方法调用)执行拦截器逻辑,此时可以使用`@Autowired`获取所需的bean。创建一个切面,定义切点并实现所需逻辑,确保在多线程环境中正确处理bean。...
这是一种通过扫描类路径中带有特定注解的类来自动完成Bean定义的过程。 4. 为了启用自动扫描和注册Bean定义,需要在Spring配置文件中使用`<context:component-scan>`标签,并通过`base-package`属性来指定需要扫描...
这样,我们就创建了一个简单的注解处理器,它可以扫描指定包下所有带有`MyComponent`注解的类,并将它们注册为Spring的bean,bean的名称由注解的`value`属性决定。 最后,为了让Spring知道并执行我们的`...
Spring通过`@ComponentScan`注解来自动发现和注册带有特定注解的bean。你可以指定包路径,Spring会扫描该路径及其子路径下的所有类,将带有@Component及其派生注解的类注册为bean。 3. **@Scope** `@Scope`注解...
2. **按名称匹配**:如果存在多个相同类型的bean,Spring会检查目标字段或构造函数是否有`@Qualifier`注解,如果有,它会根据指定的bean名称进行匹配。 3. **@Primary**:如果仍然有多个匹配的bean,Spring会选择带...
1. **扫描和发现**:Spring容器启动时,会进行组件扫描(Component Scanning),寻找标记了特定注解的类。这通常通过`@ComponentScan`注解指定包路径来实现。 2. **注册Bean**:找到的注解类会被注册为Spring Bean...
对于Singleton作用域的Bean,Spring会在容器启动时一次性实例化所有Bean。实例化顺序基于Bean的依赖关系和`@DependsOn`注解。如果Bean之间没有依赖关系,Spring将按照Bean定义的顺序实例化。对于Prototype作用域,...
这两个注解标记了在bean初始化后和销毁前需要执行的方法。 6. `@Configuration` 和 `@Bean` 当你需要更精细的控制bean的创建,可以使用`@Configuration`注解的类,然后在方法上使用`@Bean`注解来声明bean。 7. `...
利用Spring的`@Component`注解将该类注册为bean,再使用Quartz的`@DisallowConcurrentExecution`(防止并发执行)和`@PersistJobDataAfterExecution`(持久化任务数据)注解,以及Spring的`@Scheduled`注解来定义...
在本视频教程“Spring MVC + Spring + Hibernate 全注解整合开发视频教程 04”中,我们将深入探讨Java企业级开发中的三大核心技术——Spring、Spring MVC和Hibernate的集成与应用,尤其是通过注解实现的简化配置。...
在Spring框架中,`@Bean`注解是一个关键的组件,用于声明一个方法将返回的对象作为Spring容器中的bean。在`@Bean`中定义`initMethod`属性,可以指定该bean初始化时需要调用的方法。当`initMethod`被设置为异步执行,...
- **通过代码注解**:Spring也支持通过注解来获取Bean,如`@Autowired`和`@Resource`,它们能够自动将依赖注入到目标字段或方法中,无需手动从ApplicationContext获取。 3. **静态Singleton Bean Manager** 通常...
此时可以结合 @Qualifier 注解来指定特定的 Bean,例如: ```java @Autowired @Qualifier("userServiceImpl") public IUserService userService; ``` 或者 ```java @Autowired public void setUserDao(@Qualifier...
当Spring扫描指定的包路径时,它会查找带有特定注解的类,并根据注解的属性创建对应的BeanDefinition。 例如,当你在类上使用`@Component`注解时,Spring的ClassPathBeanDefinitionScanner会发现这个注解并生成一个...
首先,Spring容器通过读取XML配置文件来获取Bean的定义。这些配置文件通常以`beans.xml`的形式存在,其中包含了Bean的名称、类名、依赖关系和其他属性。例如,一个简单的Bean定义可能如下所示: ```xml <bean id=...
Spring3提供了一种无需XML配置即可完成Bean定义的方法,即通过扫描类路径中的特定注解来自动注册Bean。这种方式极大地简化了Bean的管理过程,使得开发人员能够更专注于业务逻辑的编写而非繁琐的配置工作。 #### ...
在Spring框架中,自定义注解的解析是一个强大的特性,允许开发者根据业务需求创建特定的注解,并在Spring容器启动时自动处理这些注解。本文将深入探讨如何在Spring环境中通过`component-scan`配置来处理自定义Java...
通过定义自定义注解,开发者可以为程序添加更多特定意义的信息,并通过Spring的AOP(面向切面编程)功能实现特定的行为。 1. **定义自定义注解** - 使用@interface关键字定义。 - 可以指定注解的属性(通过@...
- **Spring Framework**:Spring提供了`org.springframework.beans.BeanWrapper`和`org.springframework.beans.PropertyAccessor`接口,简化了对Bean的操作,包括注解的处理。 在实际开发中,遍历Java Bean和利用...