@autowired 和类实例变量 初始化顺序
时间: 2023-06-25 20:05:46 浏览: 130
在Java中,@Autowired注解用于自动装配依赖关系。当我们需要使用某个类的对象时,Spring会自动将其注入到需要它的地方。而类实例变量的初始化顺序则是按照声明的顺序进行的。
具体来说,当一个类被实例化时,先会执行父类的构造方法,然后按照类中实例变量的声明顺序依次进行初始化。在这个过程中,如果某个实例变量使用了@Autowired注解进行了自动装配,那么它的值将在Spring容器初始化时被注入进去。
需要注意的是,如果一个类中存在多个@Autowired注解,Spring并不会保证它们被注入的顺序。如果需要保证注入顺序,可以使用@Order注解或者实现Ordered接口来指定顺序。
另外,如果一个类中存在循环依赖的情况,Spring会抛出BeanCurrentlyInCreationException异常,表示当前Bean正在创建过程中,无法完成自动装配。此时可以使用@Lazy注解延迟加载依赖,或者使用构造函数注入来解决循环依赖问题。
相关问题
@autowired修饰的变量 和没有@autowired修饰的变量 ,谁先初始化
在 Spring 中,被 `@Autowired` 注解标记的变量是自动注入的,它的初始化顺序会在没有被注解标记的变量之前。这是因为 Spring 在启动时会扫描所有被 `@Autowired` 标注的变量,并将它们自动注入到需要它们的地方,而没有被注解标记的变量则需要在需要它们的地方手动初始化。因此,被 `@Autowired` 注解标记的变量会先于没有被注解标记的变量进行初始化。
@Autowired和@Resource的代码实例
@Autowired和@Resource都是用来进行依赖注入的注解,它们的使用方法类似,但是有一些细微的差别。
@Autowired注解:
- 可以用在构造方法、属性、方法、方法参数上。
- 如果有多个同类型的Bean,可以使用@Qualifier指定具体的Bean。
- 默认情况下,Bean是必须存在的,如果找不到对应的Bean,会抛出异常。如果希望允许不存在对应的Bean,可以使用required=false。
- 可以使用@Autowired(required=false)进行注解。
@Resource注解:
- 可以用在属性、方法、方法参数上。
- 默认情况下,按照名称进行装配,如果找不到对应名称的Bean,会抛出异常。可以使用@Resource(name="beanName")指定具体的Bean。
- 不支持required=false。
下面是一个使用@Autowired和@Resource进行依赖注入的代码示例:
```java
@Service
public class UserServiceImpl implements UserService {
// 使用@Autowired注解进行依赖注入
@Autowired
private UserDao userDao;
// 使用@Resource注解进行依赖注入
@Resource(name = "userDao")
private UserDao userDao2;
// 构造方法注入
private UserDao userDao3;
@Autowired
public UserServiceImpl(UserDao userDao3) {
this.userDao3 = userDao3;
}
// 方法注入
private UserDao userDao4;
@Autowired
public void setUserDao4(UserDao userDao4) {
this.userDao4 = userDao4;
}
// 方法参数注入
@Override
public void addUser(@Autowired UserDao userDao) {
userDao.addUser();
}
}
```
阅读全文