春季DI:聚合或组合

时间:2018-07-18 07:05:46

标签: java spring dependency-injection inversion-of-control

聚集:如果两个对象具有各自的生命周期并且彼此之间不紧密耦合(可以独立存在)。

Class A {
    B b;
} 

b的默认值为null,如果A中没有注入实例,则A's对象可以存在。

组成:如果两个对象紧密耦合且一个对象不能不存在就不能存在。

Class A{
   B b;
   A(B b){
      this.b = b;
    }
}

春季DI:在春季,如果我们在某个成员上使用@Autowired批注,那么在实例化对象之前,需要该成员。

Class A{
  @Autowired  */ now this member is required before creating of object of A.
  B b;
}

查询:因此,根据以上事实,我们可以将Spring DI视为此处的组成。我之所以要问这个问题,是因为在一次采访中,我根据采访者进行了讨论。 Spring在这里使用Aggregation。 任何人都可以请问我是否在这里想念还是找不到东西。

2 个答案:

答案 0 :(得分:0)

我认为这取决于B范围。如果B是单调的,则B管理其生命周期,因此A和B之间的关系是聚合。 如果B不是单调(原型),则每次A创建B的新实例时,都会创建该B实例并将其注入A中,并且A会管理B的生命周期,因此在这种情况下A与B之间的关系将为Composition

答案 1 :(得分:0)

我认为,Spring中的Autowire在类彼此服务时意味着更多Aggregation

例如在Service层的MVC设计模式中。您可能有两个相互服务的Service类。例如Teacher教学生,Student向老师学习。要实现这样的示例,您应该有以下两个类:

Class Teacher(){
     public void teach(Lesson lesson,Student student){
      //...
     }
}

Class Student(){
     @Autowire
     private ITeacher iTeacher;

     public void learn(Lesson lesson){
       iTeacher.teach(lesson,this);
       //...
     }
}

您看到Student取决于interface中的Teacher。和Spring选择Interface的哪个实现进行注入。从这个角度来看,bean没有耦合在一起,您可以删除实现并将其替换为另一个实现。