博客新增音乐播放器,点击打开捷径,切换或暂停音乐。

【问题集】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()方法之前运行。

posted @   霓裳梦竹  阅读(867)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2019-07-16 【性能优化】一文学会Java死锁和CPU100%问题的排查技巧
2017-07-16 【大数据系列】hadoop核心组件-MapReduce
点击右上角即可分享
微信分享提示