spring注入静态变量有几种方法?春节假期虹猫蓝兔三千问

简介: 静态变量不要用this引用,要用类名.变量,虽然你用this也能工作。

代码示例
如果直接使用@Value注入是什么结果?
/**

  • the StaticInjectionUtils

*

  • @author Java实用技术手册
  • @date 2023-01-17

*/
@Component
public class StaticInjectionUtils {

@Value("${normal.value}")
private String normalValue;

@Value("${static.value}")
private static String staticValue;

@PostConstruct
public void init() {
    System.err.println("*** normalValue=" + normalValue);
    System.err.println("*** staticValue=" + staticValue);
}

}
// 运行结果
//* normalValue=normal --有结果
//* staticValue=null --无结果
复制代码
😉set注入(推荐)
@Component
public class StaticInjectionUtils {

public static String staticValue;

@Value("${static.value}")
public void setStaticValue(String staticValue) {
    StaticInjectionUtils.staticValue = staticValue;
}

@PostConstruct
public void init() {
    System.err.println("*** staticValue=" + staticValue);
}

}
// * staticValue=static
复制代码

注意点1:
默认idea的提示set方法会带上static,将导致注入失败,比如

@Value("${static.value}")
public static void setStaticValue(String staticValue) {

StaticInjectionUtils.staticValue = staticValue;

}
复制代码

注意点2:
静态变量不要用this引用,要用类名.变量,虽然你用this也能工作。

@Value("${static.value}")
public void setStaticValue(String staticValue) {

this.staticValue = staticValue;

}
复制代码
至于为什么用this也能生效,知道的同学可以留言讨论~

注意点3:
方法名无所谓,你可以随便改,不信你试试。

😁PostConstruct注入
@Component
public class StaticInjectionUtils {

@Value("${static.value}")
private String staticValue;

public static String STATIC_VALUE2;

@PostConstruct
public void init() {
    STATIC_VALUE2 = this.staticValue;
    System.err.println("*** staticValue=" + staticValue);
    System.err.println("*** STATIC_VALUE2=" + STATIC_VALUE2);
}

}
* staticValue=static
* STATIC_VALUE2=static
复制代码
这里使用了2个知识点:

利用普通@Value变量可以注入,提前完成配置的变量保存。
利用@PostConstruct在@Value之后执行,把普通变量赋值给静态变量。

这里回忆下springbean初始化顺序:方法和注解执行先后顺序为
Constructor -> @Autowired/Value -> @PostConstruct
利用上述原理,可以做很多有用的事情,比如类初始化工作一般专门会写一个init方法。

注意点:
staticValue不能声明为static
这种方法要多定义一个无用变量,所以更推荐set注入。

🤨set变体
@Component
public class StaticInjectionUtils {

private static String staticValue;

@Autowired
public void setStaticValue(@Value("${static.value}") String staticValue) {
    System.out.println("set staticValue="+staticValue);
    StaticInjectionUtils.staticValue = staticValue;
}

@PostConstruct
public void init() {
    System.err.println("*** staticValue=" + staticValue);
}

}
复制代码
这也是set注入的一种变体,方法入参使用@Value注入,然后利用@Autowired,调用此方法注入给static变量。

注意点:

方法不能有static修饰。
方法必须使用@Autowired注解。

以上就是本期内容,希望对你有帮助。

相关文章
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
775 3
|
8月前
|
缓存 安全 Java
深入解析HTTP请求方法:Spring Boot实战与最佳实践
这篇博客结合了HTTP规范、Spring Boot实现和实际工程经验,通过代码示例、对比表格和架构图等方式,系统性地讲解了不同HTTP方法的应用场景和最佳实践。
813 5
|
10月前
|
人工智能 自然语言处理 Java
Spring 集成 DeepSeek 的 3大方法(史上最全)
DeepSeek 的 API 接口和 OpenAI 是兼容的。我们可以自定义 http client,按照 OpenAI 的rest 接口格式,去访问 DeepSeek。自定义 Client 集成DeepSeek ,可以通过以下步骤实现。步骤 1:准备工作访问 DeepSeek 的开发者平台,注册并获取 API 密钥。DeepSeek 提供了与 OpenAI 兼容的 API 端点(例如),确保你已获取正确的 API 地址。
Spring 集成 DeepSeek 的 3大方法(史上最全)
|
12月前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
570 73
|
8月前
|
Java Spring 容器
两种Spring Boot 项目启动自动执行方法的实现方式
在Spring Boot项目启动后执行特定代码的实际应用场景中,可通过实现`ApplicationRunner`或`CommandLineRunner`接口完成初始化操作,如系统常量或配置加载。两者均支持通过`@Order`注解控制执行顺序,值越小优先级越高。区别在于参数接收方式:`CommandLineRunner`使用字符串数组,而`ApplicationRunner`采用`ApplicationArguments`对象。注意,`@Order`仅影响Bean执行顺序,不影响加载顺序。
635 2
|
12月前
|
人工智能 前端开发 Java
Spring AI Alibaba + 通义千问,开发AI应用如此简单!!!
本文介绍了如何使用Spring AI Alibaba开发一个简单的AI对话应用。通过引入`spring-ai-alibaba-starter`依赖和配置API密钥,结合Spring Boot项目,只需几行代码即可实现与AI模型的交互。具体步骤包括创建Spring Boot项目、编写Controller处理对话请求以及前端页面展示对话内容。此外,文章还介绍了如何通过添加对话记忆功能,使AI能够理解上下文并进行连贯对话。最后,总结了Spring AI为Java开发者带来的便利,简化了AI应用的开发流程。
9164 2
Spring AI Alibaba + 通义千问,开发AI应用如此简单!!!
|
Java Spring
一键注入 Spring 成员变量,顺序编程
介绍了一款针对Spring框架开发的插件,旨在解决开发中频繁滚动查找成员变量注入位置的问题。通过一键操作(如Ctrl+1),该插件可自动在类顶部添加`@Autowired`注解及其成员变量声明,同时保持光标位置不变,有效提升开发效率和代码编写流畅度。适用于IntelliJ IDEA 2023及以上版本。
173 2
一键注入 Spring 成员变量,顺序编程
|
自然语言处理 Java API
Spring Boot 接入大模型实战:通义千问赋能智能应用快速构建
【10月更文挑战第23天】在人工智能(AI)技术飞速发展的今天,大模型如通义千问(阿里云推出的生成式对话引擎)等已成为推动智能应用创新的重要力量。然而,对于许多开发者而言,如何高效、便捷地接入这些大模型并构建出功能丰富的智能应用仍是一个挑战。
2738 6
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
144 1

热门文章

最新文章