Java 考虑到编译过程中参数名丢失,Spring如何按参数名自动连线?
考虑以下配置,其中创建了两个相同类型的bean: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"; } }
@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我已经用这些信息更新了我的答案