java - 如何使用非空构造函数 Autowiring 类?

标签 java spring autowired

我想要@Autowired一个具有非空构造函数的类。 以下仅作为示例,它不一定是 View /服务。可以是任何你喜欢的组件,具有非默认构造函数:

@Component
class MyViewService {
  //the "datasource" to show in the view
  private List<String> companies companies;
  private MyObject obj;

  public MyViewService(List<String> companies, MyObject obj) {
    this.companies = companies;
    this.obj = obj;
  }
}

当然我不能只写

@Autowired
private MyViewService viewService;

因为我想将构造函数与列表一起使用。但如何呢?

是否有比将此类构造函数重构为 setter 更好的方法?我不喜欢这种方法,因为理想情况下构造函数会强制其他类提供服务中所需的所有对象。如果我使用 setter ,人们很容易忘记设置某些对象。

最佳答案

如果您希望 Spring 管理 MyViewService,您必须告诉 Spring 如何创建它的实例。如果您使用 XML 配置:

<bean id="myViewService" class="org.membersound.MyViewService">
  <constructor-arg index="0" ref="ref_to_list" />
  <constructor-arg index="1" ref="ref_to_object" />
</bean>

如果您使用 Java 配置,那么您需要在 @Bean 带注释的方法中自行调用构造函数。

查看 Spring docs关于这个话题。要解决您对另一个答案所做的评论,您可以 create a List bean在 XML 中,如 Spring 文档中所示。如果列表数据不固定(可能不是),那么您需要使用 instance factory method实例化 bean。

简而言之,您寻求的答案都在 Spring 文档中:)

关于java - 如何使用非空构造函数 Autowiring 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24286546/

相关文章:

Java多线程访问一个String

java - 使用 BufferedReader 读取 Java 中的一行

java - Spring Data - 自定义查询 : count and list

java - Java Spring 应用程序的插件

java - JOptionPane 中 ArrayList 的可点击链接

java - 为什么部署到GAE的java应用程序不更新cron.xml?

java - Spring Security 中的自定义过滤器位置

spring - Spring Boot 中的全局方法安全性

java - Spring框架如何 Autowiring 一个集合

java - @Autowired 如何工作,如果 @Autowired 设置在仅使用 setter/constructor 声明但未初始化的属性(类)上