对象注入的三种实现方式

78 阅读4分钟

一,实现方式的使用

对象注入也可被称为对象装配,是把Bean对象获取出来放到某个类中。

对象注入的实现方式有3种,分别为  属性注入Setter注入 和  构造方法注入

eg:将 Service 类注入到 Controller 类中,对象注入实现:

1.属性注入

Service类

@Service
public class StudentService {
    public void sayHi(){
        System.out.println("do student service sayHi()");
    }
}

方式对应实现的Controller 类

@Controller
public class StudentController {
    //注入方式:属性注入
    @Autowired
    private StudentService studentService;
    public void sayHi(){
        System.out.println("do student controller sayHi()");
        studentService.sayHi();
    }
}

2.Setter注入

**Service类和启动类与上一样,**方式对应实现的Controller 类

@Controller
public class StudentController {
    private StudentService studentService;
    @Autowired
    public void setStudentService(StudentService studentService) {
        this.studentService = studentService;
    }
    public void sayHi(){
        System.out.println("do student controller sayHi()");
        studentService.sayHi();
    }
}

3.构造方法注入

**Service类与上一样,**方式对应实现的Controller 类代码

@Controller
public class StudentController {
    private StudentService studentService;
    @Autowired
    public StudentController(StudentService studentService) {
        this.studentService = studentService;
    }
    public void sayHi(){
        System.out.println("do student controller sayHi()");
        studentService.sayHi();
    }
}

二,方式的优缺点分析

1,属性注入

方式优点:

  • 实现简单,易于理解和维护

方式缺点:

  • 不能注入不可变对象【final 修饰的变量】
  • 通用性差,只适用于IoC容器,在非IoC框架中无效
  • 更容易违背单一设计原则

2、Setter注入

方式优点:

  • 符合单一设计原则【每个方法只传递一个对象】

方式缺点:

  • 不能注入不可变对象【final 修饰的变量】

  • 使用Setter注入的对象可能被修改

3、构造方法注入

方式优点:

  • 可以注入不可变对象【final 修饰的变量】

  • 注入对象不会被改变【构造方法只执行一次】

  • 注入对象会完全被初始化

  • 通用性更好,可在IoC容器中使用,也可在非IoC中使用

方式缺点:

  • 不符合单一设计原则【每个方法可传递多个对象】

三,对象注入中的问题

1,@Autowired 和 @Resource

在进行类注入时,除了可以使用@Autowired注解之外,我们还可以使用@Resource注解进行注入。

@Autowired@Resource 都是在 Spring 框架中用于注入依赖的注解,它们有以下区别:

  1. 来源不同:
  • @Autowired 是 Spring 框架提供的注解,通过类型进行依赖注入。
  • @Resource 是 JavaEE 定义的注解,通过名称进行依赖注入。
  1. 注入方式不同:
  • @Autowired 默认按照类型匹配的方式进行注入,如果存在多个相同类型的实例,可以结合 @Qualifier 注解来指定具体实例。
  • @Resource 默认按照名称匹配的方式进行注入,它支持使用 nametype 属性来指定名称或类型进行匹配。
  1. 支持的类型不同:
  • @Autowired 支持通过构造方法注入、属性注入、Setter 注入的方式实现依赖注入。
  • @Resource 支持通过属性注入、Setter 注入的方式实现依赖注入,不支持构造方法注入。
  1. 应用范围不同:
  • @Autowired 主要用于 Spring 框架中的组件(如 Spring Bean)的依赖注入。

  • @Resource 是 JavaEE 规范中的注解,它可以用于依赖注入和资源的获取,对于不依赖于 Spring 框架的应用也可以使用。

2,同⼀类型多个 @Bean 报错

当出现多个 Bean 返回同⼀对象类型时,程序会报错。解决同一个类型,多个bean的解决方案有以下两个:

1,使用 @Resource(name="")

2,搭配 @Autowired 使用 @Qualifierr(value = "")

四、核心总结

三种对象注入的实现方式以及优缺点?

1,属性注入方式:其实现简单,易于理解和维护,但是其不能注入不可变对象,只适用于IoC容器,并且违反单一设计原则的概率大。 

 2,Setter注入方式:其符合单一设计原则,但是其不能注入不可变对象,并且使用Setter注入的对象可能被修改。 

 3,构造方法注入方式:其可以注入不可变对象,注入的对象不能被改变,保证注入对象完全被初始化,并且具有通用性,但是其不符合单一设计原则。

以上文案为学习,原文链接在下

转载链接: blog.csdn.net/m0\_6433854…