Java 考虑到编译过程中参数名丢失,Spring如何按参数名自动连线?

Java 考虑到编译过程中参数名丢失,Spring如何按参数名自动连线?,java,spring,reflection,Java,Spring,Reflection,考虑以下配置,其中创建了两个相同类型的bean: @Configuration @ComponentScan(basePackageClasses = TwoStrings.class) public class Config { @Bean public String one() { return "one"; } @Bean public String two() { return "two"; } }

考虑以下配置,其中创建了两个相同类型的bean:

@Configuration
@ComponentScan(basePackageClasses = TwoStrings.class)
public class Config {

    @Bean
    public String one() {
        return "one";
    }

    @Bean
    public String two() {
        return "two";
    }

}
依赖于上述两个bean的另一个bean是通过组件扫描创建的:

@Component
public class TwoStrings {

    public final String a;
    public final String b;

    @Autowired
    public TwoStrings(String one, String two) {
        this.a = one;
        this.b = two;
    }

}
本地变量/参数的名称在编译过程中丢失,在运行时不可用:

然而,Spring以某种方式将两个
String
bean正确地自动关联起来。下面的示例测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Config.class )
public class Example {

    @Autowired
    private TwoStrings twoStrings;

    @Test
    public void test() {
        System.out.println(twoStrings.a);
        System.out.println(twoStrings.b);
    }

}
印刷品

one
two
如果构造函数参数的名称丢失,我希望Spring抛出异常,指出类型为
String
的bean超过1个,但是Spring不知何故使用参数名称自动连接bean

问题是Spring如何知道构造函数参数的名称?

在这种情况下,Spring是-如果您在编译代码时没有调试信息,即使用的是
-g:none
标志,那么它将失败

摘录自:

请记住,要使这项工作开箱即用,您的代码必须是 编译时启用调试标志,以便Spring可以查找 构造函数中的参数名。如果你不能编译你的代码 使用调试标志(或不希望),您可以使用@ConstructorProperties JDK注释来显式命名构造函数参数


Java 8引入了一种使用读取此信息的方法,但是类必须使用
javac的
-parameters
标志编译,什么是调试标志?这不是虚拟机选项,对吗?在IntelliJ中如何控制它?@JaroslawPawlak默认情况下它是启用的-在IntelliJ中,它可以在设置\构建、执行、部署\编译器\ Java编译器\生成调试信息中配置。Spring如何访问这些调试信息?它不能是反射API,对吗?@JaroslawPawlak为什么不能是反射API?@JaroslawPawlak我已经用这些信息更新了我的答案