Documentation is here!

我看不懂下面这句话的粗体部分,也许是整句话:

try 将@Bean方法的结果注入同一配置类也是一种有效的自引用场景.否则,此类Bean仅在备用阶段被考虑,其他配置类上的匹配Bean被选为主要候选(如果可用).

To ensure that I understand this sentence correctly, let me first explain my understanding.

自引用是指Bean A在相同的配置类中调用Bean B,或者使用其他Bean作为参数,对吗?

像这样.

@Configuration
public class JavaConfig {
    @Bean
    Course course() {
        Course course = new Course();

        return course;
    }

    @Bean
    Teacher teacher(Course course) {    // self-reference
        Teacher teacher = new Teacher();
        Course course1 = course();      // self-reference
        System.out.println(course);
        teacher.setCourse(course);

        return teacher;
    }

    @Bean
    String[] courseList() {
        String[] cs = {"OS", "Network"};

        return cs;
    }
}
public class Course {
    @Resource(name = "courseList")
    private String[] courseList;
}

public class Teacher {
    private Course course;
    public void setCourse(Course course) {
        this.course = course;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "course=" + course +
                '}';
    }
}

如果我上面的概念描述是正确的,那么我可以继续文档中描述的解决方案.

  1. 将受影响的@Bean方法声明为静态方法.

    我认为这应该是正确的,CGLIB直接调用static Course course方法,而不是调用proxy object.

@Configuration
public class JavaConfig {
    @Bean
    static Course course() {  // add static qualifier
        Course course = new Course();

        return course;
    }

    // ...
}
  1. 或者懒惰地在方法签名中实际需要的地方解析这样的引用(as opposed to an autowired field in the configuration class)

    关于这一点,我不确定如何实施.我要加@Lazy吗?这似乎不切实际,我不确定我是否遗漏了任何概念.

推荐答案

@Configuration级的情况下,你误解了self 引用.自引用是指将Course作为字段(或构造函数参数)注入JavaConfig.

@Configuration
public class JavaConfig {

 @Autowired
 private Course course;  

 @Bean
 Course course() {
   return new Course();
 }
}

现在,JavaConfig有一个类型为Course的字段.它是由相同的JavaConfig级建造的.要注入course字段,它需要执行new JavaConfig().course(),但对course()的调用只有在所有依赖项都已注入的情况下才能完成.因此,这JavaConfig人实际上依赖于自己.

有了构造函数,它会更明显

@Configuration
public class JavaConfig {

 private Course course;  

 public JavaConfig(Course course) {
   this.course=course;
 }

 @Bean
 Course course() {
   return new Course();
 }
}

Spring需要能够调用course()方法来满足构造函数参数,但要做到这一点,它需要构造一个JavaConfig,这现在是不可能的.

将字段/参数标记为@Lazy将绕过这一点,因为它将延迟实际Course的注入,直到实际需要它(即在其上调用方法).在此之前,它将为Course对象注入一个代理.

course()Bean方法设置为static也可以解决这个问题,因为由于static的性质,您不需要JavaConfig的实例来调用course()方法.

Java相关问答推荐

查找最大子数组的和

填写文本字段后锁定PDF

Quarkus keycloat配置不工作.quarkus. keycloak. policy—enforcer. enable = true在. yaml表示中不工作

Java模式匹配记录

Apache POI:使用反射获取zoom 级别

为什么BasicComboBoxRenderer在文本不存在或文本为空的情况下设置两次文本?

路径映射未发生

需要一个找不到的jakarta.sistence.EntityManager类型的Bean

我找不到&Quot;配置&的位置

Java 21 struct 化连接货币,需要可预知的子任务异常排序

Java LocalTime.parse在本地PC上的Spring Boot中工作,但在Docker容器中不工作

无法初始化JPA实体管理器工厂:无法确定为Java类型<;类>;推荐的JdbcType

为什么Spring Boot项目无法为基于MySQL的CRUD应用程序找到从JPARepository接口扩展的ProductRepository?

我的Spring Boot测试显示&IlLegalStateException:无法加载某事的ApplicationContext.

如何将Pane的图像快照保存为BMP?

有没有办法在o(log(N))中以系统的方式将数组中的小块元素复制和移动到新增长的数组中的左侧?

如何通过gradle命令行从build.gradle获得Java targetCompatibility

java.util.LinkedList()是如何成为MutableList的实例的?

ANTLR 接受特殊字符,例如 .标识符或表达式中的(点)和 ,(逗号)

如何在 WebSphere Application Server 内的托管线程上运行 BatchEE 作业(job)?