为什么@autowired在spring中不需要setter方法用于私有实例变量?

时间:2016-01-08 03:06:09

标签: spring-mvc

我的春季项目中有一些代码,如下所示

@Component
public class DatabaseAccessUtil
{
    @Autowired
    private DatabaseAccessor databaseAccessor;
}

我关注的是如何以及为什么@Autowired没有setter方法的弹簧工作注释,例如:

void setDatabaseAccessor(DatabaseAccessor databaseAccessor)
{
    this.databaseAccessor = databaseAccessor;
}
春天的奇迹在哪里?感谢

1 个答案:

答案 0 :(得分:4)

这是因为该字段的值是通过Reflection注入的。 FieldMethodConstructor都是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);
    }
}