1

如果我有 :

@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 文档,我了解到基于 setter 的注入方法比基于构造函数的注入更推荐,但在上面的示例中,我需要在当前类的构造函数中使用注入的 spring 类,以便它必须是基于构造函数的注入正确吗?

如果是这样,它会是什么样子?

@Component
class Foo {

    private Bar b; //where b is @Service

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

3 回答 3

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 创建过程。

于 2012-11-03T05:43:02.983 回答
0

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

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

于 2012-11-04T08:20:33.033 回答
0

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

做你想做的事情的通常方法是让你的 bean 实现 Spring 接口InitializingBean。在注入所有依赖项之后,您可以实现的afterPropertiesSet()方法将由 Spring 触发。

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

于 2012-11-04T12:09:07.393 回答