当前位置: 首页 > 知识库问答 >
问题:

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

薛英卫
2023-03-14

我想从基于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的配置和setter方法的可能方法。不幸的是,我找不到任何示例(对于构造函数依赖项,存在很多示例)。另外,我不确定在基于Java的配置的情况下,我应该何时使用构造函数,何时使用setter。在Spring文档中,描述了我应该使用必需的构造函数和可选依赖项的setter。但是,我认为这种方法的结果相同。感谢您的任何澄清。

亚当

共有1个答案

丁志勇
2023-03-14

假设您不能更改类本身,那么您可以一直不返回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永远不会为空,即使它的值可能为空。

 类似资料:
  • 基于setter的DI是在调用无参数构造函数或无参数静态工厂方法来实例化bean之后,通过容器调用bean上的setter方法来完成的。 例子 (Example) 以下示例显示了一个TextEditor类,它只能使用基于setter的纯注入进行依赖注入。 让我们有一个可用的Eclipse IDE,并按照以下步骤创建一个Spring应用程序 - 脚步 描述 1 创建一个名为SpringExample

  • 我有Java代码: spring配置应该是什么。xml?以下xml给出了错误信息: 创建在类路径资源[greetingConfig.xml]中定义了名为“abc”的bean时出错:设置属性值时出错;嵌套的异常是org。springframework。豆。NotWritablePropertyException:bean类[java.lang.String]的无效属性'anotherMsg':bea

  • 使用依赖注入框架(比如HK2)管理的服务时,使用方法链接是否可以接受? 我不确定是否允许它“缓存”实例,即使它只在注入范围内。 创建比萨饼的示例服务: 在这里,服务被注入到JAX-RS资源中:

  • 您可以自由地使用任何标准的Spring Framework技术来定义bean及其注入的依赖项。 为简单起见,我们经常发现使用@ComponentScan(找到你的bean)并使用@Autowired(做构造函数注入)效果很好。 如果按照上面的建议构建代码(在根包中定位应用程序类),则可以添加不带任何参数的@ComponentScan。 所有应用程序组件(@Component,@Service,@R

  • 这个问题有点难解释,但我会尽力的。 我有一个项目,我必须制作一个从第三方服务获取数据的UI,并进行反序列化和一些线程管理工作。 现在我的项目结构在视觉工作室的一个解决方案下: 项目A:用户界面 项目B:从第三方服务获取数据的API 项目C:线程管理器API 注:项目B有一个IB接口,C有一个IC接口来帮助依赖注入。项目B和C将在未来被其他团队使用。 项目A同时使用IB和IC接口进行依赖注入。 现在

  • 我遇到了依赖注入周期问题。我请求重新设计建议。提前谢谢。 错误描述:应用程序上下文中某些bean的依赖关系形成一个循环: 这是两个班 第一类: 第二类: