springboot 静态方法中使用@Autowired注入配置和Bean
Spring 框架作为 Java 开发中最流行的框架之一,其核心特性之一就是依赖注入(Dependency Injection,DI)。 在Spring中,依赖注入是通过 IOC 容器(Inversion of Control,控制反转)来实现的。
文章目录
什么是依赖注入?
依赖注入是一种设计模式,用于将对象的依赖关系从代码中分离出来,通过外部配置或容器来管理这些依赖关系。这种模式使得代码更加模块化、可测试和可维护。在 Spring 框架中,依赖注入是其核心功能之一,通过 @Autowired 注解和其他注解来实现。
依赖注入的好处
解耦:依赖注入将对象的创建和使用分离,降低了对象之间的耦合度。
可测试性:通过注入依赖,可以在单元测试中轻松替换依赖对象,从而更容易地进行测试。
灵活性:可以在运行时动态地改变依赖关系,而不需要修改代码。
可维护性:代码更加清晰和模块化,易于理解和维护。
Spring 中的依赖注入
在 Spring 框架中,依赖注入主要有三种方式:构造器注入、设值注入(Setter 注入)和字段注入(Field 注入)。
@Autowired 为什么不支持静态注入
Spring 管理的 Bean 都是有生命周期的,从创建到销毁都有明确的管理机制。静态字段属于类级别,而不是实例级别,它们在类加载时就被初始化,并且在整个应用的生命周期中都存在。由于静态字段的生命周期与 Spring 管理的 Bean 生命周期不匹配,因此 Spring 无法在合适的时机对静态字段进行依赖注入。
Spring的依赖注入
Spring 框架作为 Java 开发中最流行的框架之一,其核心特性之一就是依赖注入(Dependency Injection,DI)。 在Spring中,依赖注入是通过 IOC 容器(Inversion of Control,控制反转)来实现的。
@Autowired 不能注入 static 成员属性
静态变量和静态方法属于类,而 Spring 容器中管理的是对象,使用 @Autowired 注入的是容器中的对象实例,静态变量和方法是不能直接使用 @Autowried 注入的。
Spring 不建议开发代码中为静态变量注入属性值,类加载时会优先加载静态变量,此时 Spring 的上下文环境还没有完成加载,因此不可以为静态变量绑定值。
另一方面,在 @Autowired 注解注入扫描 Class 类原数据时,会直接忽略类的使用 static 关键字标识的成员。
@Autowired静态注入
@Autowired 是一个注释,它可以对类成员变量、方法及构造函数进行标注,让 spring 完成 bean 自动装配的工作。@Autowired 默认是按照类去匹配,配合 @Qualifier 指定按照名称去装配 bean。
@Component
public class StructUtil {
private static RestTemplate restTemplate;
private static String API_KEY;
// 通过重写set注入
@Autowired
public void setRestTemplate(RestTemplate restTemplate) {
StructUtil.restTemplate = restTemplate;
}
@Value("${tripartite.setting.apiKey}")
public void setApiKey(String apiKey) {
StructUtil.API_KEY = apiKey;
}
public static void getStruct(){
System.out.println(API_KEY);
System.out.println(restTemplate);
}
}
@PostConstruct
@PostConstruct注入
在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。
@Component
public class WeChatContant {
@Autowired
private RestTemplate restTemplate2;
private static RestTemplate restTemplate;
@PostConstruct
public void init(){
restTemplate= restTemplate2;
}
public static JSONObject doGerStr(String url){
System.out.println(restTemplate);
return null;
}
}
总结
虽然 Spring Boot 中 @Autowired 不支持静态注入,但通过上述方法,仍然可以实现类似的功能。
努力的人从不孤独,因为终有一天,我们都会在耀眼的光芒处相逢。 如果在阅读过程中发现任何错误或有任何疑问,欢迎在评论区留言交流。技术之路,共同进步。如果觉得这篇文章有用,不妨点赞、分享给更多需要的人。感谢您的阅读!
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)