Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Spring注释和xml配置注入集合的方式不同?_Java_Spring - Fatal编程技术网

Java 为什么Spring注释和xml配置注入集合的方式不同?

Java 为什么Spring注释和xml配置注入集合的方式不同?,java,spring,Java,Spring,假设有一个服务将数据存储在集合中 public class BookingService{ private Set<Record> bookingDB; public BookingService(Set<Record> bookingDB){ this.bookingDB = bookingDB; } } 公共类预订服务{ 私人订票数据库; 公共预订服务(设置预订数据库){ this.bookingDB=bookingDB;

假设有一个服务将数据存储在集合中

public class BookingService{
    private Set<Record> bookingDB;

    public BookingService(Set<Record> bookingDB){
        this.bookingDB = bookingDB;
    }
}
公共类预订服务{
私人订票数据库;
公共预订服务(设置预订数据库){
this.bookingDB=bookingDB;
}
}
现在,如果bookingDB是通过XML配置注入的

<bean id="bookingService" class="com.example.BookingService">
    <constructor-arg><set></set></constructor-arg>        
</bean>

Spring将按预期使用空记录集构造类

但如果同样的操作是通过注释完成的,那么Spring将为bookingDB构造一个集合,该集合已经包含一条由记录的默认构造函数生成的记录

@Autowired
public BookingService( Set<Record> bookingDB ) {
    this.bookingDB = bookingDB;
    System.out.println(this.bookingDB.size());
}
@Autowired
公共预订服务(设置预订数据库){
this.bookingDB=bookingDB;
System.out.println(this.bookingDB.size());
}
返回1

为什么春天会这样做?即使我显式地告诉它在bean定义中返回空的HashMap,Autowire构造函数也会被设置为1条记录

@Configuration
public class AppConfiguration {

    @Bean(name = "bookingDB")
    public Set<Record> bookingDB(){
        return new HashSet<>();
    }
}
@配置
公共类应用程序配置{
@Bean(name=“bookingDB”)
公共集预订数据库(){
返回新的HashSet();
}
}
我发现的唯一方法是直接注入值,但这忽略了通过构造函数传递DB的要点:

@Component
public class BookingService{
    @Resource(name = "bookingDB")
    private Set<Record> bookingDB;
@组件
公共类预订服务{
@资源(name=“bookingDB”)
私人订票数据库;

这实际上是关于在定义bean时进行注入,然后在初始化spring应用程序上下文时通过该bean定义集合。bean将被注入集合中

public class BookingService{
    private Set<Record> bookingDB;

    public BookingService(Set<Record> bookingDB){
        this.bookingDB = bookingDB;
    }
}

checkout

这实际上是关于在定义bean时进行注入,然后在初始化spring应用程序上下文时通过该bean定义集合。bean将被注入集合

public class BookingService{
    private Set<Record> bookingDB;

    public BookingService(Set<Record> bookingDB){
        this.bookingDB = bookingDB;
    }
}

结帐

Set bookingDB或Set bookingDB??哪一个是正确的?让我猜猜你的
记录
(或
票证
哪一个是正确的)也被标记为
@Component
?不,XML和Java版本不一样,所以它们产生不同的结果。@clevertension抱歉,这只是示例代码中的一个输入错误。
Ticket
应该是
Record
@M.Deinum是的,
Record
@Component
-这是否意味着通过属性进行注入ies是唯一的选项?Set bookingDB还是Set bookingDB?哪一个是正确的?让我猜猜你的
记录(或
哪一个是正确的)也被标记为
@Component
?不,XML和Java版本不一样,所以它们产生不同的结果。@clevertension抱歉,这只是示例代码中的一个输入错误。
Ticket
应该是
Record
@M.Deinum是的,
Record
@Component
-这是否意味着通过属性进行注入ies是唯一的选项?标记为正确答案,尽管它只完成了90%。基本上:使用注释将
集合
作为构造函数参数传递有两个方面:优点:Spring将自动收集该类型的所有初始化bean并将其传递给构造函数。缺点:Spring将自动收集所有初始化的bean如果上下文中没有bean,至少会使用默认构造函数标记为正确答案构建一个实例,尽管它只完成了90%。基本上:使用注释传递
集合
作为构造函数参数有两个方面:优点:Spring将自动收集该类型的所有初始化bean并将其传递给构造函数。缺点:Spring将自动收集该类型的所有初始化bean并将其传递给构造函数。如果上下文中没有bean,则至少会使用默认构造函数生成一个实例