Spring 实现给Bean属性注入null值

时间:2021-07-20 23:10:30

给Bean属性注入null值

空字符串值可以使用<value/>元素可用来表示。例如:

?
1
2
3
<bean class="ExampleBean">
  <property name="email"><value/></property>
</bean>

等同于Java代码: exampleBean.setEmail("")。

null值则可以使用<null/>元素可用来表示。例如:

?
1
2
3
<bean class="ExampleBean">
  <property name="email"><null/></property>
</bean>

等同于Java代码:exampleBean.setEmail(null)。

Spring注入bean 为null的相关问题

问题描述

有一个类注入 发现里面的MongoLogInfoDAO始终为null

?
1
2
3
4
5
6
7
8
9
@Component("countFunction")
public class CountFunction implements AviatorFunction {   
    @Resource(name = "mongoLogInfoDAO")
    private MongoLogInfoDAO mongoLogInfoDAO;
 
    @Override
    public String getName() {
        return "count";
    }

原因是竟然是因为使用了 new 方式使用 CountFunction 导致类中的mongoLogInfoDao 无法注入

?
1
AviatorEvaluator.addFunction(new CountFunction());

这个是不对的, 为啥?

这个对象是你new出来的 ,不是spring创建的 当然无法DI依赖注入

反之,如果你这个Bean是交易Spring IOC 容器管理的,那也应该报错NoSuchBeanDefinitionException异常

如何处理?

应对这个问题的最好办法是 不要new

还有一种情况spring 注入的时候是null

问题描述

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
@Component("functionExecutor")
public class FunctionExecutor {
    protected static final Loggerx LOGGER = Loggerx.getLogger("system");
 
    @Resource(name = "mongoDAO")
    private MongoDAO mongoDAO;
 
    @Resource(name = "prism4001Producer")
    private SmartMQProducer prism4001Producer;
    
    @Resource(name = "whereGreaterThenFunction")
    private  WhereGreaterThenFunction whereGreaterThenFunction;
    
    @Resource(name = "countFunction")
    private  CountFunction countFunction;
    
    @Resource(name = "devideFunction")
    private  DevideFunction devideFunction;
    
    @Resource(name = "selectFunction")
    private  SelectFunction selectFunction;
    
    @Resource(name = "whereEqualFunction")
    private  WhereEqualFunction whereEqualFunction;
    
    @Resource(name = "timeFunction")
    private  TimeFunction timeFunction;
    
    @Resource(name = "whereLessThenFunction")
    private  WhereLessThenFunction whereLessThenFunction;
    
    @Resource(name = "whereGreaterThenEqualFunction")
    private  WhereGreaterThenEqualFunction whereGreaterThenEqualFunction;
    
    @Resource(name = "whereInFunction")
    private  WhereInFunction whereInFunction;
    
    @Resource(name = "greaterThenFunction")
    private  GreaterThenFunction greaterThenFunction;
    
    @Resource(name = "regexFunction")
    private  RegexFunction regexFunction;
    
    @Resource(name = "maxFunction")
    private  MaxFunction maxFunction;
    
    @Resource(name = "minFunction")
    private  MinFunction minFunction;
    
    @Resource(name = "equalFunction")
    private  EqualFunction equalFunction;
    
    @Resource(name = "lessThenEqualFunction")
    private  LessThenEqualFunction lessThenEqualFunction;
    
    @Resource(name = "lessThenFunction")
    private  LessThenFunction lessThenFunction;
    
    @Resource(name = "plusFunction")
    private  PlusFunction plusFunction;
    
    @Resource(name = "multiFunction")
    private  MultiFunction multiFunction;
    
    @Resource(name = "notEqualFunction")
    private  NotEqualFunction notEqualFunction;
    
    @Resource(name = "whereNotInFunction")
    private  WhereNotInFunction whereNotInFunction;
    
    @Resource(name = "sumFunction")
    private  SumFunction sumFunction;
    
    @Resource(name = "minusFunction")
    private  MinusFunction minusFunction;
    
   {
        AviatorEvaluator.addFunction(whereGreaterThenFunction);
        AviatorEvaluator.addFunction(countFunction);
        AviatorEvaluator.addFunction(devideFunction);
        AviatorEvaluator.addFunction(selectFunction);
        AviatorEvaluator.addFunction(whereEqualFunction);
        AviatorEvaluator.addFunction(timeFunction);
        AviatorEvaluator.addFunction(whereLessThenFunction);
        AviatorEvaluator.addFunction(whereGreaterThenEqualFunction);
        AviatorEvaluator.addFunction(whereInFunction);
        AviatorEvaluator.addFunction(greaterThenFunction);
        AviatorEvaluator.addFunction(regexFunction);
        AviatorEvaluator.addFunction(maxFunction);
        AviatorEvaluator.addFunction(minFunction);
        AviatorEvaluator.addFunction(equalFunction);
        AviatorEvaluator.addFunction(lessThenEqualFunction);
        AviatorEvaluator.addFunction(lessThenFunction);
        AviatorEvaluator.addFunction(plusFunction);
        AviatorEvaluator.addFunction(multiFunction);
        AviatorEvaluator.addFunction(notEqualFunction);
        AviatorEvaluator.addFunction(whereNotInFunction);
        AviatorEvaluator.addFunction(sumFunction);
        AviatorEvaluator.addFunction(minusFunction);
    }

容器加载这个functionExecutor这个bean的时候,走到静态代码块发现注入的sumFunction ,minusFunction都是null

这个是为什么呢?

spring 执行代码块的时候,其他的bean 还未注入,会导致注入的bean 是null

如何处理?

如果你想 当spring加载 bean 初始化完成之后,自动执行一些初始化方法

使用

@PostConstruct

注解可以实现

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/xiaojia1100/article/details/51595362