1. 构造器注入(Constructor Injection)
- 通过类的构造函数来注入依赖项。构造器注入的好处是使得依赖项在对象创建时即被注入,因此依赖项是不可变的,更适合不可变的依赖关系。
- 示例:
在上面的例子中,@Service public class MyService { private final MyRepository myRepository; @Autowired public MyService(MyRepository myRepository) { this.myRepository = myRepository; } // 业务逻辑方法 }MyRepository作为依赖通过构造函数注入到MyService中。
2. Setter方法注入(Setter Injection)
- 通过 Setter 方法来注入依赖项。这种方式的优点是允许依赖项在对象实例化之后进行设置或更改,适合可选的或延迟初始化的依赖。
- 示例:
在这个例子中,@Service public class MyService { private MyRepository myRepository; @Autowired public void setMyRepository(MyRepository myRepository) { this.myRepository = myRepository; } // 业务逻辑方法 }MyRepository通过setMyRepository方法被注入到MyService中。
3. 属性注入(Field Injection)
- 直接在类的属性上使用
@Autowired注解来注入依赖项。这种方式的优点是代码简洁,但不适合处理不可变的依赖关系,通常不推荐用于重要的服务类中。 - 示例:
在这个例子中,@Service public class MyService { @Autowired private MyRepository myRepository; // 业务逻辑方法 }MyRepository直接注入到MyService的字段中。
总结
- 构造器注入:更适合不可变的依赖关系,推荐用于服务类。
- Setter方法注入:适合可选的或延迟初始化的依赖关系,可以在需要时注入或更改依赖项。
- 属性注入:代码简洁,但不适合不可变的依赖关系,通常不推荐用于重要的服务类中。
此外,关于@Autowired是否可以省略的问题:
- 构造器注入:当类只有一个构造函数时,
@Autowired可以省略(Spring 4.3 及以上版本)。 - Setter方法注入:如果只有一个 Setter 方法,
@Autowired可以省略(Spring 4.3 及以上版本)。个人不建议省略,亲测有时会失效。 - 属性注入:
@Autowired不可省略。
747

被折叠的 条评论
为什么被折叠?



