Spring - 使用其他自动装配字段初始化字段

Spring - Initialize field using other autowired field

我想解决以下问题的最佳方法是什么

我有一个具有一些依赖项和我需要的非 bean 字段的服务

@Service
public class ServiceImpl{
 @Autowired
 OtherService otherService;

 @Autowired
 DaoImpl dao;

 Entity entity;
}

我需要使用 dao.getDefault() 方法初始化 "entity" 字段,这是我的方法

@Service
public class ServiceImpl{
 @Autowired
 OtherService otherService;

 DaoImpl dao;

 Entity entity;

 @Autowired
 public ServiceImpl(DaoImpl dao){
  this.dao = dao;
  entity = dao.getDefault();
 }
}

混合基于构造函数和基于字段的依赖注入是一种好习惯吗?我无法使用 @PostConstruct,因为我无权访问 spring 配置文件来启用它。感谢所有建议。

不,将构造函数注入与字段注入结合使用不是好的做法。事实上,仅使用字段注入也被认为是不好的做法。就 google "Constructor vs field injection".

所以我建议也为 otherService 使用构造函数注入。

BTW1,对所有字段使用 private

顺便说一句,@PostConstruct 应该开箱即用,无需额外配置

顺便说一句,您正在构造函数中从数据库中检索值。这通常被认为是不好的做法。

你有几种初始化 bean 的方法 Spring:

  • 构造函数注入。
  • 二传手注入。
  • 使用@Autowired注入。

也可以通过 Java class 上的 Spring 注释组合配置样式,例如:

@Configuration
@AnnotationDrivenConfig // enable the @Autowired annotation
@ImportXml("classpath:mySpringConfigurationFile.xml")
public class MyConfig {

@Autowired
DaoImpl dao;

@Bean
public ServiceImpl myService() {
    // Inject the autowired dao from XML source file.
    return new ServiceImpl(dao);
}

}

您至少需要 Spring 2.5 并且 Spring post 必须设置处理器配置:

<beans>
    ...
    <!-- JavaConfig post-processor -->
    <bean class="org.springframework.config.java.process.ConfigurationPostProcessor"/>
</beans>