当前位置: 首页 > wzjs >正文

做建材的网站做路线图的网站

做建材的网站,做路线图的网站,二级建造师报名时间2022年官网,企业电子商务的网站的建设方式以下是关于 Spring Boot 中的 Aware 接口以及 ApplicationContextAware 的详细说明、使用示例及注意事项: 一、Aware 接口简介 Spring 框架提供了一系列 Aware 接口,用于让 Bean 在初始化时感知并获取 Spring 容器中的特定组件。这些接口通过回调方法&a…

以下是关于 Spring Boot 中的 Aware 接口以及 ApplicationContextAware 的详细说明、使用示例及注意事项


一、Aware 接口简介

Spring 框架提供了一系列 Aware 接口,用于让 Bean 在初始化时感知并获取 Spring 容器中的特定组件。这些接口通过回调方法,将容器或相关对象注入到 Bean 中,使其能够与容器交互。

常见 Aware 接口

接口名称功能描述回调方法
BeanNameAware获取当前 Bean 的名称setBeanName(String name)
BeanFactoryAware获取 BeanFactory 实例setBeanFactory(BeanFactory)
ApplicationContextAware获取 ApplicationContext 实例setApplicationContext()
ApplicationEventPublisherAware发布事件setApplicationEventPublisher()

二、ApplicationContextAware 的作用

ApplicationContextAware 是最常用的 Aware 接口之一,允许 Bean 直接获取 Spring 应用上下文(ApplicationContext。通过它,可以:

  • 动态获取容器中的其他 Bean。
  • 访问资源(如 messageSourceenvironment 等)。
  • 发布或监听应用事件。

三、使用步骤与示例

1. 实现 ApplicationContextAware
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;@Component  // 将 Bean 注入 Spring 容器
public class MyApplicationContext implements ApplicationContextAware {private static ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext context) throws BeansException {applicationContext = context; // 保存 ApplicationContext 引用}// 提供静态方法获取 Beanpublic static <T> T getBean(Class<T> beanClass) {return applicationContext.getBean(beanClass);}public static Object getBean(String beanName) {return applicationContext.getBean(beanName);}
}
2. 在其他 Bean 中使用
@Service
public class MyService {public void doSomething() {// 通过静态方法获取其他 BeanAnotherService anotherService = MyApplicationContext.getBean(AnotherService.class);anotherService.someMethod();}
}
3. 访问资源或环境变量
// 获取环境变量
Environment env = MyApplicationContext.getApplicationContext().getEnvironment();
String property = env.getProperty("my.config.key");// 获取消息资源
MessageSource messageSource = MyApplicationContext.getApplicationContext().getBean(MessageSource.class);
String message = messageSource.getMessage("key", null, Locale.getDefault());

四、关键特性

  1. 回调时机

    • setApplicationContext() 方法在 Bean 初始化阶段调用,早于 @PostConstruct
  2. 线程安全

    • ApplicationContext 是单例且线程安全的,但需确保静态引用的线程安全。
  3. 适用场景

    • 需要动态获取未在依赖注入中声明的 Bean
    • 需要直接访问容器的资源(如 EnvironmentMessageSource)。

五、注意事项

1. 避免过度使用
  • 反模式:通过 ApplicationContext 随意获取 Bean 可能破坏依赖注入的封装性,导致代码耦合度增加。
  • 推荐:优先使用 依赖注入(@Autowired),仅在必要时(如动态获取 Bean)使用 ApplicationContext
2. 单例与作用域
  • ApplicationContext 是单例的,但获取的 Bean 可能是原型(Prototype)作用域,需注意线程安全问题。
3. 测试时的局限性
  • 在单元测试中,需确保 ApplicationContext 已正确初始化(如使用 @SpringBootTest)。

六、替代方案

1. 依赖注入
@Service
public class MyService {@Autowiredprivate AnotherService anotherService; // 直接注入
}
2. 使用 @Resource@Inject
@Service
public class MyService {@Resource(name = "anotherService")private AnotherService anotherService;
}

七、总结表格

接口用途典型场景
ApplicationContextAware获取全局容器,动态访问 Bean需要访问未注入的 Bean 或容器资源
BeanNameAware获取当前 Bean 的名称需要记录或使用 Bean 名称
BeanFactoryAware获取 BeanFactory 实例需要自定义 Bean 创建逻辑(如工厂模式)
ApplicationEventPublisherAware发布应用事件实现事件驱动的解耦通信

八、使用场景示例

场景 1:动态获取 Bean
@Component
public class DynamicBeanFetcher {public void doWork() {// 动态获取配置的 BeanString beanName = "dynamicBean";Object bean = MyApplicationContext.getBean(beanName);if (bean != null) {// 执行操作}}
}
场景 2:访问配置属性
@Component
public class ConfigAccessor {public String getConfigValue() {Environment env = MyApplicationContext.getApplicationContext().getEnvironment();return env.getProperty("app.config.key");}
}

九、替代方案对比

方案优点缺点
依赖注入(@Autowired)解耦、类型安全、易于测试需预先声明依赖
ApplicationContextAware动态获取 Bean,灵活访问容器资源破坏封装性,增加耦合度
@Resource支持名称和类型注入需要 Bean 存在

通过以上分析,可以明确 ApplicationContextAware 的使用场景、实现方式及潜在风险,合理选择是否采用该接口以满足项目需求。

http://www.dtcms.com/wzjs/552379.html

相关文章:

  • 江苏省网站备案邯郸市永年区做网站的公司
  • 安徽外贸网站建设做招聘网站需要资质吗
  • 网站开发与维护专业要学什么什么网站不能备案
  • 超大免费网站空间广告字制作哪家好
  • 高端网站建设公司兴田德润可以不asp.net网站开发源码
  • 如何将网站地图提交给百度企业系统化管理的优势
  • 网站开发定价自响应式网站是什么意思
  • 中小企业网站提供了什么iphone下载网页视频
  • 合肥网站建设市场wordpress不能编辑文章
  • 电商素材网站怎么做售房网站
  • 苏州公司网站建设唐山快速建站的公司
  • 游戏运营备案官方网站工作总结个人范文
  • 网站keywords标签怎么写博客网站搭建
  • 俄文手机网站制作wordpress 数据库插件
  • 设计网站账号广州工商注册流程
  • 做网站备案必须是个人还是公司网站建设行业研究
  • 留言网站建设杭州九鸿科技网站开发
  • 网站建设目的及意义素材网站开发
  • 做充气气模产品一般去哪些网站自己做的网站背景怎么设置
  • 外贸推广用中文网站做支付行业招代理一般上什么网站
  • 如何建立一个网站分享教程软件开发项目验收报告
  • 哈尔滨网站建设方案微信号 网站模板
  • 招生门户网站建设方案建设企业银行电脑版怎么下载
  • 网站站点风格如何开个公司网站
  • 大连模板网站制作推荐工业设计公司属于什么行业
  • 石家庄营销推广网站wordpress 图片 空间
  • 一个备案号多个网站义乌建设局网站打不开
  • 超市网站模板盐城网站开发代理商
  • 谷歌网站地图seo有哪些优化工具
  • 哈尔滨建设网站公司吗小米wordpress