构造方法注入和setter注入之间的区别吗?

构造方法注入和setter注入之间的区别吗?

有以下几点明显的差异:

  1. 在Setter注入,可以将依赖项部分注入,构造方法注入不能部分注入,因为调用构造方法如果传入所有的参数就会报错。

  2. 如果我们为同一属性提供Setter和构造方法注入,Setter注入将覆盖构造方法注入。但是构造方法注入不能覆盖setter注入值。显然,构造方法注入被称为创建实例的第一选项。

  3. 使用setter注入你不能保证所有的依赖都被注入,这意味着你可以有一个对象依赖没有被注入。在另一方面构造方法注入直到你所有的依赖都注入后才开始创建实例。

  4. 在构造函数注入,如果A和B对象相互依赖:A依赖于B,B也依赖于A,此时在创建对象的A或者B时,Spring抛出ObjectCurrentlyInCreationException。所以Spring可以通过setter注入,从而解决循环依赖的问题。

 

构造器注入

<bean id="person" class="com.oak.entity.Person"> <constructor-arg index="0" value="二狗"/> <constructor-arg index="1" value="18"/> </bean>

setter方法注入

<bean id="personSet" class="com.oak.entity.Person"> <property name="age" value="18"/> <property name="name" value="二蛋"/> </bean>

哪种依赖注入方式你建议使用,构造器注入,还是 Setter方法注入?

你两种依赖方式都可以使用,构造器注入和Setter方法注入。最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖。

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
构造函数注入Setter方法注入和接口注入都是依赖注入(DI)的实现方式。 构造函数注入: ```java public class UserServiceImpl implements UserService { private final UserRepository userRepository; public UserServiceImpl(UserRepository userRepository) { this.userRepository = userRepository; } } ``` 在这个例子中,`UserServiceImpl` 类的构造函数接受一个 `UserRepository` 实例作为参数,并将其赋值给类的私有字段。这种方式是最常见的依赖注入方式。 Setter方法注入: ```java public class UserServiceImpl implements UserService { private UserRepository userRepository; public void setUserRepository(UserRepository userRepository) { this.userRepository = userRepository; } } ``` 在这个例子中,`UserServiceImpl` 类有一个名为 `setUserRepository` 的 Setter 方法,它接受一个 `UserRepository` 实例作为参数,并将其赋值给类的私有字段。这种方式相对于构造函数注入来说,更加灵活,因为我们可以在任何时候调用 Setter 方法来设置依赖。 接口注入: ```java public interface UserService { void setUserRepository(UserRepository userRepository); } public class UserServiceImpl implements UserService { private UserRepository userRepository; @Override public void setUserRepository(UserRepository userRepository) { this.userRepository = userRepository; } } ``` 在这个例子中,`UserService` 接口有一个名为 `setUserRepository` 的方法,`UserServiceImpl` 类实现了这个接口,并在实现中实现了 `setUserRepository` 方法。这种方式可以通过接口的实现来实现依赖注入。但是这种方式比较少用,因为它需要多写一个接口和实现类,增加了代码量和复杂度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值