使用xml注入属性值的时候,该属性必须要有set方法。
使用注解注入属性值的时候,该属性可以没有set方法。
为什么注解@Autowired注入属性的时候,可以没有set方法呢?
既然是注解,那么肯定有对注解@Autowired的解析。
触发解析:
Spring容器在每个Bean实例化之后,调用AutowiredAnnotationBeanPostProcessor的postProcessMergedBeanDefinition方法。
Spring在每个Bean实例化的时候,调用populateBean进行属性注入的时候,即调用postProcessPropertyValues方法。
具体代码就不深究了,其中有一段主要代码
没有set方法,field.set(bean,value);能对属性设值吗?
我们来做个验证:
User类的test属性没有set方法
public class User {
private String test;
@Override
public String toString() {
return "User [test=" + test + "]";
}
}
public static void main(String[] args) throws Exception {
User user = new User();
Class clazz = User.class;
Field field = clazz.getDeclaredField("test");
field.setAccessible(true);
field.set(user, "qqq");
System.out.println(user);
}
结果:没有set方法,field.set(bean,value);能对属性设值。