static 修饰了 @Autowired 注入的东西 为什么是null
时间: 2024-02-21 20:22:12 浏览: 84
如果使用了 `static` 修饰 `@Autowired` 注入的属性,则该属性会在类加载时被初始化,而不是在实例化对象时被初始化。因此,这个属性可能会在其他属性初始化之前被初始化,导致注入的值为 null。
要解决这个问题,可以使用非静态的属性或者使用 `@PostConstruct` 注解在初始化方法中对该属性进行初始化。另外,也可以使用静态工厂方法或者 `@Bean` 注解来创建对象,而不是使用 `@Autowired` 注入对象。
相关问题
被@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 ]
阅读全文