Spring Java配置Bean方法调用是否在运行时注入了托管bean?

时间:2014-06-20 04:38:03

标签: java spring

请考虑以下代码:

public class AImpl implements A {}

public class BImpl implements B {
    private final A a;

    public B(A a){
        this.a = a;
    }
}

@Configuration
public class MyConfiguration {
    @Bean
    public A bean1(){
        return new AImpl(); 
    }

    @Bean 
    public B bean2() {
        return new BImpl(bean1());
    }

    @Bean
    public B bean3() {
        return new BImpl(bean1());
    }
}

bean2bean3bean1的引用是弹出托管单例还是新实例?即Spring的拦截方法是否在Java配置类中调用,并使用适当的应用程序上下文代理?

从我的理解

更新,CGLIB库参与java配置类来修改字节码,这是否意味着后一种情况是真的?我还没有完全了解它是如何运作的。

1 个答案:

答案 0 :(得分:0)

Class A应该在同一个bean2的同一个对象中同时代表bean2ApplicationContext(特别是如果您在Beans中声明@Configuration作为方法{1}}),但您也可以使用Spring Container中实现的依赖注入。我认为这段代码更清晰明确,但读者必须知道Autoriwiring的工作原理。

此代码等效:

@Configuration
    public class MyConfiguration {
    @Bean
    public A bean1(){
        return new AImpl(); 
    }

    @Bean 
    public B bean2(A bean1) {
        return new BImpl(bean1);
    }

    @Bean
    public B bean3(A bean1) {
        return new BImpl(bean1);
    }
}

第二种方式:

在声明的类上添加@Component和@Inject / @Autowired(在遗留代码中,不能在没有AOP的情况下执行此操作)。

@Component
public class AImpl implements A {}

@Component
public class BImpl implements B {
    private final A a;

    @Inject
    public B(A a){
        this.a = a;
    }
}

但是此解决方案需要将@ComponentScan(packages="name.of.your.package")添加到您的@Configuration课程中。

@ComponentScan(packages="name.of.your.package")
@Configuration
public class MyConfiguration {
    ...
}