通过setter方法和Configuration类进行sping依赖注入

时间:2017-11-07 22:26:05

标签: java spring spring-boot spring-config

我想从基于xml的spring配置切换到基于java的。对于构造函数类型的注入,很容易。我正在使用的示例:

@Configuration
public class BeanConfiguration {

    @Bean
    public GreetingService greetingService(GreetingDao greetingDao) {
        return new GreetingService(greetingDao);
    }

    @Bean
    public GreetingDao greetingDao() {
        return new GreetingDao();
    }
}

然而,当我想通过setter方法注入时,我正在做这样的事情:

@Configuration
public class BeanConfiguration {

    @Bean
    public MeetingDao meetingDao() {
        return new MeetingDao();
    }

    @Bean
    public MeetingService meetingService(MeetingDao meetingDao) {
        MeetingService meetingService = new MeetingService();
        meetingService.setMeetingDao(meetingDao);
        return meetingService;
    }

}

我不确定这是否是一种注入基于Java的Configuration和setter方法的可行方法。不幸的是我找不到任何示例(对于构造函数依赖项,存在很多示例)。另外,我不确定基于Java的配置何时应该使用构造函数和何时使用setter。在Spring文档中,描述了我应该使用构造函数来获取可选依赖项的必需和setter。但是,我认为这种方法的结果相同。 谢谢你的任何澄清。

亚当

1 个答案:

答案 0 :(得分:0)

假设你不能自己更改类,你可能总是在注入所有值之前不返回bean。

CREATE TRIGGER [dbo].ToMetadataJobNumberCreation
    --only if tblTometadata.TOMetadataJobNumber is updated with new jobnumber
ON [dbo].tblTometadata
AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    IF UPDATE (TOMetadataJobNumber) 
    BEGIN                       
        UPDATE eventLogs 
        SET dataPointValue = TOMetadataJobNumber, 
            dataPointType = 'JOBNUMBER'
        FROM eventLogs
        JOIN inserted ins on ins.TOMetadataParentJobID = dataPointValue
        WHERE dataPointType = 'ORDERNUMBER'; 
    END 
END

构造函数注入总是首选,具有类依赖性,但并非总是可行。 如果您有权更改正在创建的这些服务和bean的源代码,那么我建议使用构造函数注入并放置" @ Service"在班级和" @ Autowired"在构造函数上。

属性是"可选"的一个例子。依赖;如果未提供,则默认值和行为是常见的。我更喜欢放置" @ Value"直接在该字段而不是我的构造函数,因为否则你可能会得到太多的参数。这是" setter"注射,但你不想要一个真正的setter方法(再次,通常不是反正);你只希望Spring更改值,而不是任何其他代码。

使用" @ Value"如果你只有一两个属性(或3个?它不是一门精确的科学),那就好了;但是,如果你发现你有很多字段" @ Value"那么你应该使用配置bean。一个" @ConfigurationProperties" bean也可以用" setter"注入,但我更喜欢构造函数注入,以确保至少bean永远不会为null,即使它的值可能是。