2016-09-21 61 views
2

考虑以下与所创建的相同类型的两个豆配置:鉴于在编译过程中参数的名称会丢失,Spring如何通过参数名自动装入?

@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; 
    } 

} 

的局部变量/参数的名称编译过程中丢失,并且不可在运行时:

enter image description here

但是,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 

示例性测试考虑的构造函数的参数名称都丢了,我希望春天抛出异常说,有超过1种豆String型的,但是春天以某种方式使用参数名称自动装入bean。

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

回答

6

在这种情况下,Spring是using debug information - 如果您编译的代码没有调试信息,即-g:none标志为javac,它将会失败。

documentation

提取物:

请记住,使这项工作了您的代码必须 编译与调试标志启用,以便Spring能够从构造函数中查找 参数名称的方块。如果您不能使用调试标志编译代码 (或不想),则可以使用@ConstructorProperties JDK注释来明确指定您的构造函数参数。

的Java 8推出了一种方式,阅读使用Reflection API此信息,但这些类必须用-parameters标志javac

+0

什么是调试标志编译?这不是虚拟机选项,对吧?我如何在IntelliJ中控制它? –

+0

@JaroslawPawlak默认启用 - 在IntelliJ中,它可以在Settings \ Build,Execution,Deployment \ Compiler \ Java Compiler \中生成调试信息 – bedrin

+0

Spring如何访问这些调试信息?它不能是反射API,对吧? –

相关问题