Spring的ApplicationContextAware的使用

Spring的ApplicationContextAware的使用

Spring中ApplicationContextAware主要用来获取Spring上下文已经实例化的Bean对象

1 问题引入

项目使用Spring管理各个实例对象Bean, 如果为了使用已被实例化的Bean对象,如果使用再次加载配置文件的方法,可能会出现一个问题,如一些线程配置任务, 会启动两份,产生了冗余.

ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");  
UserService userService = (UserService)appContext.getBean("userService");  

2 ApplicationContextAware的简介

当一个类实现了ApplicationContextAware接口,这个类就可以方便获取ApplicationContext中的所有bean,即这个类可以获取Spring配置文件中管理的所有Bean对象.

@Component
public class DateUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext arg0) throws BeansException {
        applicationContext = arg0;
    }

    public static Object getObject(String id) {
        Object object = applicationContext.getBean(id);
        return object;
    }
}

在Spring配置文件中, 将自定义类注册到Spring中,在类中可以灵活的获取ApplicationContext, Spring能自动执行setApplicationContext方法,获得ApplicationContext对象,ApplicationContext对象是由spring注入的,且Spring配置文件中存在该对象.

3 使用场景

ApplicationContextAware获取ApplicationContext上下文的情况,适用于当前运行的代码和已启动的Spring代码处于同一个Spring上下文,否则获取到的ApplicationContext是空的.

常见的使用场景有:

  • 在监听器中, 去监听到事件的发生, 然后从Spring的上下文中获取Bean对象, 去修改保存相关的业务数据.
  • 在某个工具类中, 需要提供处理通用业务数据的方法等

案例代码:

// @Component 可加注解可不加   hutool工具类中也提供类似工具类
// hutool中添加了 并且引用到注解中, 如不加 可单独在配置类中添加Bean对象
public class SpringUtils implements ApplicationContextAware {
    private static ApplicationContext app = null;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        setApp(applicationContext);
    }


    public static ApplicationContext getApp() {
        return app;
    }

    public static void setApp(ApplicationContext app) {
        SpringUtils.app = app;
    }

    public static Object getBean(String name) {
        return getApp().getBean(name);
    }

    public static <T>T getBean(Class<T> clazz) {
        return getApp().getBean(clazz);
    }

    public static <T>T getBean(String name,Class<T> clazz) {
        return getApp().getBean(name,clazz);
    }

}

使用场所:
1 在EasyExcel中,因为不能直接注入Spring管理Bean对象, 而又想使用数据库保存操作, 可以使用

// 通过工具类拿到spring中UserMapper对象
UserMapper userMapper = SpringUtils.getBean(UserMapper.class);
userMapper.batchInsert(userList);

2 在工具类中,需要统一公共处理数据. 如在上下文工具类中要获取当前用户的性别信息, 需要通过用户号,查询用户表.

// 通过工具类拿到spring中UserMapper对象
UserMapper userMapper = SpringUtils.getBean(UserMapper.class);
User user = userMapper.selectById(userId
);
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值