zoukankan      html  css  js  c++  java
  • 【问题集】Static 静态变量 不能直接使用 @autowired标签的问题

    1.问题原因

    被static修饰变量,是不属于任何实例化的对象拥有,spring的依赖注入只能在对象层级上进行依赖注入,所以不能直接使用@autowired标签进行注入。

    2.解决方案

    2.1 在静态方法中使自定义的工具类,该工具类实现ApplicationContextAware ,在该工具类中通过applicationContext.getBean 来湖区想要的bean类。

    public class SpringContextUtil implements ApplicationContextAware {
        private static ApplicationContext applicationContext = null;
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            SpringContextUtil.applicationContext = applicationContext;
        }
        public static ApplicationContext getApplicationContext() {
            return applicationContext;
        }
        public static Object getBean(String beanName) {
    
            return applicationContext.getBean(beanName);
        }
        public static Object getBeanByNull(String beanName) {
    
            try {
                return applicationContext.getBean(beanName);
            }
            catch (NullPointerException e)
            {
                return null;
            }
        }
        public static boolean containsBean(String beanName) {
            return applicationContext.containsBean(beanName);
        }
    }
    
    

    2.2 使用@autowired 标签进行set方法注入。

    具体为,将需要视同bean申明为静态的全局变量, 在通过set方法注入,在静态方法中就能直接使用该变量。

    @Component
    public class TestClass{
        private static FirstClass firstClass;
        
        @Autowired
        public void setFirstClass(FirstClass firstClass){
            TestClass.firstClass = firstClass;
        }
        public static void print(){
            firstClass.print();
        }
    }
    

    2.3 使用@PostConstruct注解

    @Component
    public class TestClass{
        @Autowired
        private FirstClass firstClass;;
        
        private static FirstClass firstClass2;
        @PostConstruct
        public void init(){
            firstClass2=firstClass;
        }
        public static void print(){
            firstClass2.print();
        }
    }
    

    被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的init()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。

  • 相关阅读:
    PS 如何制作眼泪效果
    PS 基础知识 什么是Adobe Bridge
    PS 抠图如何使用通道法处理头发
    PS 如何使用抽出滤镜抠人物的头发丝等细节
    PS 如何用PS制作GIF图像
    PS 如何制作柔和的边框
    PS 基础知识 如何绘制几何图形
    PS 基础知识 渐变编辑器如何使用
    PS 基础知识 CMYK全称是什么
    [Functional Programming] Daggy
  • 原文地址:https://www.cnblogs.com/dream-to-pku/p/13320934.html
Copyright © 2011-2022 走看看