什么是依赖注入?

依赖注入是一种设计模式,用于将对象的依赖关系从代码中分离出来,通过外部配置或容器来管理这些依赖关系。这种模式使得代码更加模块化、可测试和可维护。在 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 不支持静态注入,但通过上述方法,仍然可以实现类似的功能。


努力的人从不孤独,因为终有一天,我们都会在耀眼的光芒处相逢。 如果在阅读过程中发现任何错误或有任何疑问,欢迎在评论区留言交流。技术之路,共同进步。如果觉得这篇文章有用,不妨点赞、分享给更多需要的人。感谢您的阅读!
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐