繁体   English   中英

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

[英]Spring dependency injection via setter method and Configuration class

我想从基于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来表示可选性依赖项。 但是,我认为这种方法的结果相同。 感谢您的澄清。

亚当

在您不能更改类本身的假设下,始终可以在注入所有值之前不返回Bean。

@Configuration
public class YourConfig{

    @Value("${some.value.from.properties}")
    private String someValue;

    @Bean
    @Autowired
    public YourBean yourBean(TheDependency theDependency){

        YourBean bean = new YourBean();
        bean.setTheDependency(theDependency);
        bean.setSomeValue(someValue);

        return bean;
    }
}

构造函数注入总是具有类依赖关系,但并非总是可能的。 如果您有权更改要创建的这些服务和bean的源,则建议使用构造函数注入,并在类上放置“ @Service”,在构造函数上放置“ @Autowired”。

属性是“可选”依赖项的示例; 如果未提供,默认值和行为是很常见的。 我更喜欢直接将“ @Value”放置在该字段而不是我的构造函数上,因为否则您可能最终会获得太多的参数。 这是“ setter”注入,但是您不需要实际的setter方法(同样,通常也不是)。 您只希望Spring更改值,而不希望其他任何代码。

如果您只有一个或两个属性(或3个属性,这不是一门确切的科学方法),则使用“ @Value”很好。 但是,如果发现有很多带有“ @Value”的字段,则应改用配置Bean。 “ @ConfigurationProperties” bean也可以与“ setter”注入以相同的方式处理,但我更喜欢构造函数注入,以确保至少bean永远不会为null,即使它的值可能为null。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM