• 使用SpringContextHolder获取bean实例


    1,介绍与使用
    SpringContextHolder工具类的方法getBean可以获取bean的实例。但是工具类的方法是不是static的,等同于@Autowired 注入。

    解决问题:

    类中方法是static,方法中使用的对象也必须是static,但正常情况下@Autowired无法注入静态的bean,于是发现项目中用到了springContextHolder,通过使用;

    UserService userService = SpringContextHolder.getBean(UserService.class);   // 获取bean

    2.异常  

    使用SpringContextHolder来获取一个bean报异常:

    Java.lang.IllegalStateException: applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder.
        at org.apache.commons.lang3.Validate.validState(Validate.java:826)
        at com.jituan.common.util.SpringContextHolder.assertContextInjected(SpringContextHolder.java:79)
        at com.jituan.common.util.SpringContextHolder.getBean(SpringContextHolder.java:41)
        at com.jituan.common.message.util.sms.SmsUtil.querySmsTemplate(SmsUtil.java:206)
        at com.jituan.common.message.util.sms.SmsUtil.send(SmsUtil.java:76)
        at com.jituan.common.message.processer.SmsProcesser.send(SmsProcesser.java:37)
        at com.jituan.batch.msghandler.MessageHandler.smsSend(MessageHandler.java:106)
        at com.jituan.batch.msghandler.MessageHandler$SmsTread.run(MessageHandler.java:185)

    1)配置spring-mvc.xml

    <!-- 设全局变量以便可以获得对应的注入bean -->
    <bean id="springContextHolder" class="com.jituan.common.util.SpringContextHolder" />

    2)在SpringContextHolder类上加入注解@Service、@Lazy(false)

    import java.util.Map;
     
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
     
    /**
     *
     *以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候中取出ApplicaitonContext.
     * @author Bucky
     */
    @Service
    @Lazy(false)
    public class SpringContextHolder implements ApplicationContextAware{
     
        private static ApplicationContext applicationContext;
     
         
        //实现ApplicationContextAware接口的context注入函数, 将其存入静态变量.
        public void setApplicationContext(ApplicationContext applicationContext) {
            SpringContextHolder.applicationContext = applicationContext;
        }
     
        
        //取得存储在静态变量中的ApplicationContext.
        public static ApplicationContext getApplicationContext() {
            checkApplicationContext();
            return applicationContext;
        }
         
        //从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.
        @SuppressWarnings("unchecked")
        public static <T> T getBean(String name) {
            checkApplicationContext();
            return (T) applicationContext.getBean(name);
        }
     
         
        //从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.
        //如果有多个Bean符合Class, 取出第一个.
        @SuppressWarnings("unchecked")
        public static <T> T getBean(Class<T> clazz) {
            checkApplicationContext();
            @SuppressWarnings("rawtypes")
                    Map beanMaps = applicationContext.getBeansOfType(clazz);
            if (beanMaps!=null && !beanMaps.isEmpty()) {
                return (T) beanMaps.values().iterator().next();
            } else{
                return null;
            }
        }
     
        private static void checkApplicationContext() {
            if (applicationContext == null) {
                throw new IllegalStateException("applicaitonContext未注入,请在applicationContext.xml中定义SpringContextHolder");
            }
        }
     
    }
    

      

  • 相关阅读:
    494 Target Sum 目标和
    493 Reverse Pairs 翻转对
    492 Construct the Rectangle 构建矩形
    491 Increasing Subsequences 递增子序列
    488 Zuma Game 祖玛游戏
    486 Predict the Winner 预测赢家
    485 Max Consecutive Ones 最大连续1的个数
    483 Smallest Good Base
    Django Form组件
    Django Auth组件
  • 原文地址:https://www.cnblogs.com/blogslee/p/10825703.html
Copyright © 2020-2023  润新知