static 修饰了 @Autowired 注入的东西 为什么是null
时间: 2024-02-21 22:21:55 浏览: 105
当使用 @Autowired 注解时,Spring 框架会自动将相应的 Bean 注入到该类中。但是,如果使用了 static 关键字修饰了 @Autowired 注入的属性,则该属性会在类加载时就被初始化,而不是在 Spring 容器中注入 Bean 后再被初始化。因此,在属性被初始化时,Spring 容器还没有对该属性进行注入,导致该属性为 null。
解决此问题的一种方法是将 @Autowired 注解放在非静态属性或者 setter 方法上,这样属性在 Spring 容器注入 Bean 后再进行初始化。另外,也可以使用 Spring 提供的 @PostConstruct 注解,在 Bean 初始化完成后再进行一些操作,例如对静态属性赋值。
相关问题
被@PostConstruct修饰的方法想要使用redistemplate怎么写
被@PostConstruct修饰的方法想要使用redistemplate,可以通过在类中定义一个静态的RedisTemplate对象,并在被@PostConstruct修饰的方法中将注入的RedisTemplate对象赋值给静态对象。这样,在其他静态方法中就可以直接使用该静态对象来操作Redis了。具体代码如下所示:
```java
@Component
public class RedisUtil {
private static RedisTemplate<Object, Object> redisTemplates;
@Autowired
private RedisTemplate<Object, Object> redisTemplate;
@PostConstruct
public void initialize() {
redisTemplates = this.redisTemplate;
}
// 其他静态方法可以直接使用redisTemplates来操作Redis
public static void set(Object key, Object value) {
if (key == null || value == null) {
return;
}
redisTemplates.opsForValue().set(key, value);
}
}
```
在上述代码中,被@PostConstruct修饰的initialize方法将注入的RedisTemplate对象赋值给了静态的redisTemplates对象。这样,在set方法中就可以直接使用redisTemplates来操作Redis了。
#### 引用[.reference_title]
- *1* *2* *3* [@PostConstruct注解详解](https://blog.csdn.net/weixin_52256162/article/details/128457610)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
获取对象@ApiModelProperty
通过反射获取指定类@ApiModelProperty注解修饰的name值和value值的方法如下所示:
```java
public static LinkedHashMap<String, String> getApiModelProperty(String classPath) {
LinkedHashMap<String, String> res = new LinkedHashMap<>();
try {
// 1.根据类路径获取类
Class<?> c = Class.forName(classPath);
// 2.获取类的属性
Field[] declaredFields = c.getDeclaredFields();
// 3.遍历属性,获取属性上ApiModelProperty的值,属性的名,存入res
if (declaredFields.length != 0) {
for (Field field : declaredFields) {
if (field.getAnnotation(ApiModelProperty.class) != null) {
// 这存的key为注解的[name类属性名,value为注解的[value值
res.put(field.getName(), field.getAnnotation(ApiModelProperty.class).value());
}
}
return res;
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
```
这个方法可以动态获取指定类对象的所有带有@ApiModelPropery注解的属性的name和value值,并返回一个LinkedHashMap对象,其中属性名作为key,注解的value值作为value。
这个方法可以方便地将@Autowired注解转换为map格式,并且可以通过更改注解类型,比如@TableField注解等,来获取不同注解的属性值。
请注意,这个方法是用于获取对象的@ApiModelPropery注解,如果想获取其他注解的属性值,只需将代码中的@ApiModelPropery换成相应的注解即可。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *3* [Spring Boot进阶(13):如何获取@ApiModelProperty(value = “序列号“, name = “uuid“)中的value值 | ...](https://blog.csdn.net/weixin_43970743/article/details/127083749)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *2* [动态获取属性名与@ApiModelProperty注解值](https://blog.csdn.net/weixin_48788601/article/details/129800971)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
阅读全文