Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SpringJava配置bean方法调用是否在运行时被注入托管bean?_Java_Spring - Fatal编程技术网

SpringJava配置bean方法调用是否在运行时被注入托管bean?

SpringJava配置bean方法调用是否在运行时被注入托管bean?,java,spring,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 AIm

考虑以下代码:

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());
    }
}
bean2
bean3
的引用必须是
bean1
是spring管理的单例还是新实例?也就是说,spring是否在Java配置类中拦截方法调用,并将其代理到适当的应用程序上下文


更新据我所知,CGLIB库涉及java配置类来修改字节码,这是否意味着后一种情况是正确的?我只是还没有完全了解它是如何工作的。

A类
应该在
bean2
bean2
中由相同的
ApplicationContext
对象表示(特别是如果您在
@Configuration
中将
bean
声明为方法时),但您也可以使用Spring容器中实现的依赖注入。在我看来,这段代码更加清晰和明确,但读者必须知道自动换行是如何工作的

此代码等效为:

@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,您无法在遗留代码中执行此操作)

但此解决方案需要将
@组件扫描(packages=“name.of.your.package”)
添加到
@配置
类中

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

所以你要说的是,它确实是托管bean的代理,但是为了清晰起见,我应该使注入显式化。顺便说一句,你的第一个建议中没有@Autowired/@Inject有什么关系,还是你把它们漏掉了?
@ComponentScan(packages="name.of.your.package")
@Configuration
public class MyConfiguration {
    ...
}