我的春季项目中有一些代码,如下所示
@Component
public class DatabaseAccessUtil
{
@Autowired
private DatabaseAccessor databaseAccessor;
}
我关注的是如何以及为什么@Autowired没有setter方法的弹簧工作注释,例如:
void setDatabaseAccessor(DatabaseAccessor databaseAccessor)
{
this.databaseAccessor = databaseAccessor;
}
春天的奇迹在哪里?感谢
答案 0 :(得分:4)
这是因为该字段的值是通过Reflection
注入的。 Field
,Method
和Constructor
都是java.lang.reflect.AccessibleObject
的后代。此类允许通过调用setAccessible(true)
将可访问标志设置为true来访问其私有成员。
以下是AutowiredBeanPostProcessor
执行实际注入的实际代码
if (value != null) {
ReflectionUtils.makeAccessible(field);
field.set(bean, value);
}
ReflectionUtils.makeAccessible(Field)
public static void makeAccessible(Field field) {
if ((!Modifier.isPublic(field.getModifiers()) ||
!Modifier.isPublic(field.getDeclaringClass().getModifiers()) ||
Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) {
field.setAccessible(true);
}
}