Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring mvc 为什么spring中的@autowired不需要私有实例变量的setter方法?_Spring Mvc - Fatal编程技术网

Spring mvc 为什么spring中的@autowired不需要私有实例变量的setter方法?

Spring mvc 为什么spring中的@autowired不需要私有实例变量的setter方法?,spring-mvc,Spring Mvc,我的spring项目中有一些代码,如下所示 @Component public class DatabaseAccessUtil { @Autowired private DatabaseAccessor databaseAccessor; } 我关心的是spring的@Autowired注释在没有setter方法的情况下如何工作以及为什么工作,例如: void setDatabaseAccessor(DatabaseAccessor databaseAccessor) {

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

@Component
public class DatabaseAccessUtil
{
    @Autowired
    private DatabaseAccessor databaseAccessor;
}
我关心的是spring的@Autowired注释在没有setter方法的情况下如何工作以及为什么工作,例如:

void setDatabaseAccessor(DatabaseAccessor databaseAccessor)
{
    this.databaseAccessor = databaseAccessor;
}

春天的奇迹在哪里?谢谢

这是因为字段的值是通过注入的,都是我们的后代。此类通过调用将accessible标志设置为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);
    }
}