setter注入和构造方法注入有什么异同
时间: 2024-01-03 07:04:23 浏览: 25
setter注入和构造方法注入都是依赖注入的方式,用于实现对象之间的松耦合。它们的主要区别在于注入的时机和方式。
构造方法注入是在创建对象时,通过构造方法将依赖传递给目标对象。这意味着依赖在对象创建时就已经设置,而且不能更改。因此,构造方法注入适用于必须满足的依赖关系,例如必须初始化的属性或必须传递的参数。
而setter注入是在对象创建后,通过setter方法将依赖注入到目标对象中。这意味着依赖可以在对象创建后随时更改。因此,setter注入适用于可选的依赖关系或需要更改的依赖关系。
总之,构造方法注入适用于必须满足的依赖关系,而setter注入适用于可选的或需要更改的依赖关系。
相关问题
setter注入 与 构造器注入 示例
Setter注入和构造器注入都是依赖注入的方式,用于将一个对象的依赖项注入到它当中,使得对象能够正常运行。它们各自有着不同的特点和应用场景。
构造器注入是指在创建一个对象的时候,通过构造函数将依赖项传递进去。这种方式下,依赖项是对象创建时必须的,因此它们是对象的一部分。构造器注入是一种强依赖的注入方式,它能够确保对象创建时依赖项已经准备就绪,从而保证对象的正常运行。
示例:假设有一个电脑对象,它有一个硬盘依赖项,通过构造器注入的方式可以这样实现:
```java
public class Computer {
private HardDrive hardDrive;
public Computer(HardDrive hardDrive) {
this.hardDrive = hardDrive;
}
}
```
Setter注入是指在对象创建好之后,通过setter方法将依赖项注入进去。这种方式下,依赖项是可选的,因为对象创建完毕后可以随时注入依赖项。Setter注入是一种松散的注入方式,它能够灵活地注入不同的依赖项,从而增强了对象的可配置性和可扩展性。
示例:继续以上面的电脑对象为例,我们可以通过setter注入的方式实现硬盘的注入:
```java
public class Computer {
private HardDrive hardDrive;
public void setHardDrive(HardDrive hardDrive) {
this.hardDrive = hardDrive;
}
}
```
总的来说,构造器注入适用于对象初始化时必需的依赖项,而setter注入适用于对象创建后可选的依赖项。在实际应用中,可以根据具体情况选择合适的注入方式来满足对象的需求。
spring中setter注入注解
在Spring中,使用注解进行setter注入的方式,可以通过以下注解来实现:
1. @Autowired:用于自动装配Bean,可以用在setter方法、属性和构造函数上。
2. @Qualifier:用于指定Bean的名称,当有多个Bean时,可以指定其中一个Bean。
3. @Resource:用于自动装配Bean,可以用在setter方法、属性和构造函数上。与@Autowired不同的是,@Resource可以指定Bean的名称。
4. @Value:用于注入Bean的属性值,可以用在setter方法和属性上。
示例代码:
```
public class UserServiceImpl implements UserService {
private UserDao userDao;
@Autowired
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public UserDao getUserDao() {
return userDao;
}
}
```
在上面的代码中,使用@Autowired注解标注了setUserDao方法,Spring会自动将UserDao的实例注入到userDao属性中。
另外,还可以通过使用@Resource注解来指定Bean的名称:
```
public class UserServiceImpl implements UserService {
private UserDao userDao;
@Resource(name = "userDaoImpl")
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public UserDao getUserDao() {
return userDao;
}
}
```
在上面的代码中,@Resource注解指定了Bean的名称为"userDaoImpl",Spring会自动将该名称对应的UserDao实例注入到userDao属性中。