在spring中,实现applicationcontextaware接口可让bean获取applicationcontext以手动获取其他bean,适用于@autowired不可用的场景;需确保类由spring管理,避免在构造方法或@postconstruct中使用,并推荐用context.getbean(string, class)安全获取bean。

在 Spring 中,可以通过实现 ApplicationContextAware 接口,让 Bean 在初始化时自动获得应用上下文(ApplicationContext),从而手动获取容器中其他 Bean。这种方式适用于无法通过依赖注入(如 @Autowired)直接注入的场景,比如工具类、静态方法调用、或某些框架回调中需要动态获取 Bean。
实现 ApplicationContextAware 接口
自定义类实现该接口,并重写 setApplicationContext 方法,Spring 容器会在 Bean 初始化完成后自动调用它,传入当前上下文实例:
- 必须确保该类本身是 Spring 管理的 Bean(例如加
@Component或配置在 XML 中); - 不能在构造方法或
@PostConstruct中使用applicationContext,因为此时上下文可能尚未注入; - 推荐将
ApplicationContext存为 static 字段(需注意线程安全与生命周期问题),或作为实例变量供后续使用。
常用获取 Bean 的方式
拿到 ApplicationContext 后,可通过以下方法获取 Bean:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
context.getBean(String beanName):按名称获取,返回Object,需强制类型转换; -
context.getBean(Class<t> requiredType)</t>:按类型获取,要求容器中该类型 Bean 唯一; -
context.getBean(String beanName, Class<t> requiredType)</t>:按名称和类型获取,最安全,推荐使用; -
context.getBeansOfType(Class<t> type)</t>:获取所有指定类型的 Bean(Map 形式),适合多实现场景。
典型使用示例
例如编写一个通用的 Bean 工具类:
<font color="#888"><!-- 注意:该类必须由 Spring 管理 --></font><p><strong>@Component</strong><br>
public class BeanUtils implements ApplicationContextAware {<br>
private static ApplicationContext context;<br><br>
@Override<br>
public void setApplicationContext(ApplicationContext applicationContext) {<br>
context = applicationContext;<br>
}<br><br>
public static <t> T getBean(Class<t> clazz) {<br>
return context.getBean(clazz);<br>
}<br><br>
public static <t> T getBean(String name, Class<t> clazz) {<br>
return context.getBean(name, clazz);<br>
}<br>
}</t></t></t></t></p><p>之后可在任意地方调用 <code>BeanUtils.getBean(XXXService.class)</code> 获取 Bean。</p><h3>注意事项与替代方案</h3><p>虽然方便,但过度依赖手动获取会削弱 Spring 的依赖注入优势,增加隐式耦合:</p>
- 避免在业务核心逻辑中频繁使用,优先考虑构造器注入或
@Autowired; - 若用于非 Spring 管理对象(如 Servlet、Filter),需确保
ApplicationContext已正确初始化(如使用WebApplicationContextUtils); - Spring 5.3+ 推荐使用
ObjectProvider或Aware接口的轻量替代,或通过ApplicationContextInitializer预置上下文; - 在单元测试中,需手动设置上下文,否则
context为 null。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










