Spring 3 setter-injection:当你需要在另一个类的构造函数中使用注入的类时,它是如何完成的?

时间:2012-11-03 05:26:10

标签: spring dependency-injection

如果我有:

@Component
class Foo {

    @Autowired      
    private Bar b; //where b is @Service

     public Foo(){          
        //if i need to use b here, what do i need to do?
        b.something(); // <-- b is null so it'll crash here
    }

    public void setB(Bar b){
        this.b = b;
    }
}

从阅读Spring文档我明白基于构造函数的注入方法比基于构造函数的注入更受推荐,但在上面的例子中,我需要在当前类的构造函数中使用注入的spring类,因此它必须是基于构造函数的注入正确?

如果是这样的话会是什么样的?

@Component
class Foo {

    private Bar b; //where b is @Service

    @Autowired
     public Foo(Bar b){
        b.something(); // b won't be null now !
    }
}

3 个答案:

答案 0 :(得分:0)

您需要在application-context.xml(或等效的spring配置文件)中定义bean,如下所示:

<bean id="b" class="Bar" />
<bean id="f" class="Foo">
    <constructor-arg ref="b" />
</bean>

然后从Foo类中删除那些@Component@Autowired注释。 @Component将尝试在组件扫描期间找到默认构造函数,并使bean创建过程失败。

答案 1 :(得分:0)

代码有效,是的,@ Autowired可用于连接构造函数参数。

您也可以使用setter注入然后声明init-method或使用@PostConstruct来初始化bean。

答案 2 :(得分:0)

您可以创建一个使用@PostConstruct注释的方法,如前所述: http://www.mkyong.com/spring/spring-postconstruct-and-predestroy-example/ 这需要额外的依赖性和一些配置。

执行所需操作的常用方法是使bean实现Spring接口InitializingBean。 在注入所有依赖项之后,Spring可以实现afterPropertiesSet()方法。

您最好使用注释,一旦配置它更简单,更易于阅读,并与Java EE兼容。