Springboot 注入方式

打印 上一主题 下一主题

主题 1055|帖子 1055|积分 3165

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在 Spring Boot 中,依靠注入是一种紧张的设计模式,用于实现组件之间的解耦。常见的注入方式紧张有以下几种:
1. 构造函数注入



  • 原理:通过构造函数来完成依靠注入,在创建 Bean 实例时,Spring 容器会根据构造函数的参数类型和数量,主动将相应的依靠对象通报给构造函数举行初始化。
  • 优点

    • 包管依靠的不可变性,一旦对象创建完成,其依靠关系就不会再改变。
    • 包管依靠的完整性,因为在创建对象时就必须提供所有须要的依靠,避免了对象在使用过程中出现依靠缺失的题目。
    • 支持依靠的不可为空性,使用构造函数注入可以在编译时就发现依靠缺失的题目。

  • 示例代码
  1. import org.springframework.stereotype.Service;
  2. // 定义一个服务接口
  3. interface MyService {
  4.     void doSomething();
  5. }
  6. // 实现服务接口
  7. @Service
  8. class MyServiceImpl implements MyService {
  9.     @Override
  10.     public void doSomething() {
  11.         System.out.println("Doing something...");
  12.     }
  13. }
  14. // 使用构造函数注入依赖
  15. @Service
  16. class MyClient {
  17.     private final MyService myService;
  18.     // 构造函数注入
  19.     public MyClient(MyService myService) {
  20.         this.myService = myService;
  21.     }
  22.     public void performAction() {
  23.         myService.doSomething();
  24.     }
  25. }
复制代码
2. Setter 方法注入



  • 原理:通过对象的 Setter 方法来完成依靠注入,Spring 容器在创建 Bean 实例后,会调用相应的 Setter 方法将依靠对象注入到 Bean 中。
  • 优点

    • 可以在对象创建后动态地修改依靠关系。
    • 对于可选的依靠注入比力方便,因为可以不提供相应的依靠,而不会影响对象的创建。

  • 缺点

    • 不能包管依靠的不可变性,因为可以在对象创建后通过 Setter 方法修改依靠。
    • 不能包管依靠的完整性,因为可以不调用 Setter 方法注入依靠,导致对象在使用过程中出现依靠缺失的题目。

  • 示例代码
  1. import org.springframework.stereotype.Service;
  2. // 定义一个服务接口
  3. interface MyService {
  4.     void doSomething();
  5. }
  6. // 实现服务接口
  7. @Service
  8. class MyServiceImpl implements MyService {
  9.     @Override
  10.     public void doSomething() {
  11.         System.out.println("Doing something...");
  12.     }
  13. }
  14. // 使用 Setter 方法注入依赖
  15. @Service
  16. class MyClient {
  17.     private MyService myService;
  18.     // Setter 方法注入
  19.     public void setMyService(MyService myService) {
  20.         this.myService = myService;
  21.     }
  22.     public void performAction() {
  23.         if (myService != null) {
  24.             myService.doSomething();
  25.         }
  26.     }
  27. }
复制代码
3. 字段注入



  • 原理:通过在类的字段上使用 @Autowired、@Resource 或 @Inject 等注解来完成依靠注入,Spring 容器会主动将相应的依靠对象注入到该字段中。
  • 优点

    • 代码轻便,不需要编写构造函数或 Setter 方法。

  • 缺点

    • 违反了单一职责原则,因为类的字段直接依靠于外部对象,使得类的可测试性变差。
    • 不能包管依靠的不可变性,因为可以在对象创建后通过反射修改字段的值。
    • 不能包管依靠的完整性,因为在某些环境下(如使用无参构造函数创建对象),大概会导致依靠缺失。

  • 示例代码
  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.stereotype.Service;
  3. // 定义一个服务接口
  4. interface MyService {
  5.     void doSomething();
  6. }
  7. // 实现服务接口
  8. @Service
  9. class MyServiceImpl implements MyService {
  10.     @Override
  11.     public void doSomething() {
  12.         System.out.println("Doing something...");
  13.     }
  14. }
  15. // 使用字段注入依赖
  16. @Service
  17. class MyClient {
  18.     @Autowired
  19.     private MyService myService;
  20.     public void performAction() {
  21.         myService.doSomething();
  22.     }
  23. }
复制代码
4. 方法注入



  • 原理:通过在类的方法上使用 @Autowired 等注解来完成依靠注入,Spring 容器会在调用该方法时将相应的依靠对象作为参数通报给方法。
  • 示例代码
  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.stereotype.Service;
  3. // 定义一个服务接口
  4. interface MyService {
  5.     void doSomething();
  6. }
  7. // 实现服务接口
  8. @Service
  9. class MyServiceImpl implements MyService {
  10.     @Override
  11.     public void doSomething() {
  12.         System.out.println("Doing something...");
  13.     }
  14. }
  15. // 使用方法注入依赖
  16. @Service
  17. class MyClient {
  18.     private MyService myService;
  19.     @Autowired
  20.     public void initialize(MyService myService) {
  21.         this.myService = myService;
  22.     }
  23.     public void performAction() {
  24.         myService.doSomething();
  25.     }
  26. }
复制代码
在实际开发中,构造函数注入通常是首选的注入方式,因为它具有更好的可维护性和可测试性。而字段注入虽然代码轻便,但在一些复杂场景下大概会带来一些题目,应谨慎使用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

西河刘卡车医

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表