使用 ApplicationContextAware 获取 Spring 管理 Bean
程序员文章站
2022-05-25 22:54:28
...
有时候我们在一些独立的的线程中会用到受
Spring
管理的类,比如一条专门用来发短信、增加积分的线程。这时候不应该在重新 new 一个新对象进行使用,一方面已经有被 Spring 管理了,再 new 的话比较浪费。另一方面如果单纯的 new 一个对象,就不能使用这个类里面注入的 Spring 管理的 Bean 进行操作。
使用ApplicationContextAware接口
ApplicationContextAware
是 Spring 官方提供的一个用来解决如下类似问题的接口:
- 但在某些特殊的情况下,
Bean
需要实现某个功能,但该功能必须借助于 Spring 容器才能实现,此时就必须让该Bean先获取Spring 容器
,然后借助于Spring容器实现该功能。为了让 Bean 获取它所在的 Spring 容器,可以让该Bean实现ApplicationContextAware
接口。
如下代码,实现了 ApplicationContextAware
接口,并提供了几种获取 Spring容器中 Bean 的功能:
@Component
public class SpringContextHandler implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {
SpringContextHandler.applicationContext = context;
}
/**
* 获取applicationContext对象
*/
public static ApplicationContext getApplicationContext() {
assertContextInjected();
return applicationContext;
}
/**
* 根据bean的id来查找对象
*
* @param name bean名称
* @return bean
*/
public static <T> T getBeanByName(String name) {
assertContextInjected();
return (T) applicationContext.getBean(name);
}
/**
* 根据bean的class来查找对象
*
* @param c class对象
* @return bean
*/
public static <T> T getBeanByClass(Class c) {
assertContextInjected();
return (T) applicationContext.getBean(c);
}
/**
* 根据bean的class来查找所有的对象(包括子类)
*
* @param c class对象
* @return bean Map
*/
public static Map getBeansByClass(Class c) {
assertContextInjected();
return applicationContext.getBeansOfType(c);
}
/**
* 检查ApplicationContext不为空.
*/
private static void assertContextInjected() {
Validate.validState(applicationContext != null,
"applicaitonContext属性未注入, 请把SpringContextHandler交由Spring管理");
}
}
工具类完成,需要在非Spring管理的类中使用Spring容器管理的Bean时即可使用此工具进行获取。
上一篇: Springboot - 获得应用程序上下文ApplicationContext并构建工具类
下一篇: spring ApplicationContext了解和ApplicationContextAware的简单使用
推荐阅读
-
Spring中Bean的生命周期使用解析
-
spring如何使用命名空间p简化bean的配置
-
Spring启动后获取所有拥有特定注解的Bean实例代码
-
Spring在代码中获取bean的几种方式详解
-
Spring实战之使用XML方式管理声明式事务操作示例
-
FastJson序列化自定义返回字段,普通类从spring容器中获取bean
-
使用OkHttp获取本地服务器目录下的json数据并解析为Bean对象
-
Spring高级装配,Profile的使用,条件化Bean,解决歧义性
-
idea创建一个入门Spring Boot项目(controller层)使用Moven代码管理
-
使用 BeanDefinition 描述 Spring Bean