spring中对象注入的三种实现方式

 更新时间:2023年07月19日 09:23:16   作者:小杨MiManchi  
本文主要介绍了spring中对象注入的三种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

本文主要介绍了对象注入的实现,分享给大家,具体如下:

一,实现方式的使用

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

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

为了更好地理解对象注入的实现方式,搞个实例来具体说明:

1.0,前期准备

1,准备Service类

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

示例问题:将 Service 类注入到 Controller 类中,对象注入实现:

1.1,属性注入

1,方式对应实现的Controller 类代码:

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

2,启动类实现代码:

public class App {
    public static void main(String[] args) {
        //1,获取Spring上下文
        ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("spring-config.xml");
        //2,得到Bean对象
        StudentController studentController =
                applicationContext.getBean("studentController",StudentController.class);
        //3,使用Bean对象
        studentController.sayHi();
    }
}

3,启动类执行结果:

1.2,Setter注入

1,方式对应实现的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();
    }
}

2,启动类实现代码:

public class App {
    public static void main(String[] args) {
        //1,获取Spring上下文
        ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("spring-config.xml");
        //2,得到Bean对象
        StudentController studentController =
                applicationContext.getBean("studentController",StudentController.class);
        //3,使用Bean对象
        studentController.sayHi();
    }
}

3,启动类执行结果:

image-20230710103836173

1.3,构造方法注入

1,方式对应实现的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();
    }
}

2,启动类实现代码:

public class App {
    public static void main(String[] args) {
        //1,获取Spring上下文
        ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("spring-config.xml");
        //2,得到Bean对象
        StudentController studentController =
                applicationContext.getBean("studentController",StudentController.class);
        //3,使用Bean对象
        studentController.sayHi();
    }
}

3,启动类执行结果:

image-20230710103841006

二,方式的优缺点分析

2.1,属性注入

1,方式实现代码:

image-20230710104809219

2,方式优点:

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

3,方式缺点:

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

2.2,Setter注入

1,方式实现代码:

image-20230710105024612

2,方式优点:

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

3,方式缺点:

  • 不能注入不可变对象【final 修饰的变量】
  • 使用Setter注入的对象可能被修改

2.3,构造方法注入

1,方式实现代码:

image-20230710105124339

注意:如果只有一个构造方法,那么 @Autowired 注解可以省略。

2,方式优点:

  • 可以注入不可变对象【final 修饰的变量】
  • 注入对象不会被改变【构造方法只执行一次】
  • 注入对象会完全被初始化
  • 通用性更好,可在IoC容器中使用,也可在非IoC中使用

3,方式缺点:

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

三,对象注入中的问题

3.1,@Autowired 和 @Resource

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

image-20230710111811566

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

来源不同:

  • @Autowired 是 Spring 框架提供的注解,通过类型进行依赖注入。
  • @Resource 是 JavaEE 定义的注解,通过名称进行依赖注入。

注入方式不同:

  • @Autowired 默认按照类型匹配的方式进行注入,如果存在多个相同类型的实例,可以结合 @Qualifier 注解来指定具体实例。
  • @Resource 默认按照名称匹配的方式进行注入,它支持使用 nametype 属性来指定名称或类型进行匹配。

支持的类型不同:

  • @Autowired 支持通过构造方法注入、属性注入、Setter 注入的方式实现依赖注入。
  • @Resource 支持通过属性注入、Setter 注入的方式实现依赖注入,不支持构造方法注入。

应用范围不同:

  • @Autowired 主要用于 Spring 框架中的组件(如 Spring Bean)的依赖注入。
  • @Resource 是 JavaEE 规范中的注解,它可以用于依赖注入和资源的获取,对于不依赖于 Spring 框架的应用也可以使用。

3.2,同类型多个 @Bean 报错

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

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

image-20230710113255725

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

image-20230710113416657

核心总结

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

属性注入,Setter注入和构造方法注入是在依赖注入中常用的三种方式,它们各有优缺点:

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

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

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

注意:在上述的三种对象注入的实现方式中,构造方法注入是Spring推荐的注入方式。

思考:为什么构造方法可以注入不可变变量,而属性注入和Setter注入却不行呢?

解答:在 Java 中,被final修饰的对象,要么直接进行赋值,要么就在构造方法中进行赋值,两种情况必须满足一个,否则方式报错。

2,@Autowired 和 @Resource 注入注解的区别?

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

1,来源不同:@Autowired 是 Spring 框架提供的注解,而@Resource 是 JavaEE 定义的注解。

2,注入方式不同:@Autowired 默认按照类型匹配的方式进行注入,而@Resource 默认按照名称匹配的方式进行注入。

3,支持的类型不同:@Resource 支持通过属性注入、Setter 注入的方式实现依赖注入,不支持构造方法注入,而@Autowired 支持。

4,应用范围不同:@Autowired 主要用于 Spring 框架中的组件的依赖注入,而@Resource对于不依赖于 Spring 框架的应用也可使用。

3,同类型多个 @Bean 报错的解决方案有哪些?

解决同一个类型 @Bean 报错的解决方案有以下两个:

使用 @Resource(name="")使用 @Qualifierr(value = "") 【搭配@Autowired使用】 结语

到此这篇关于spring中对象注入的三种实现方式的文章就介绍到这了,更多相关spring 对象注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决定时任务@Scheduled没有准时执行的原因及分析

    解决定时任务@Scheduled没有准时执行的原因及分析

    这篇文章主要介绍了解决定时任务@Scheduled没有准时执行的原因及分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • idea中git如何删除commit提交的log信息

    idea中git如何删除commit提交的log信息

    这篇文章主要介绍了idea中git如何删除commit提交的log信息问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Java 线程池详解及实例代码

    Java 线程池详解及实例代码

    这篇文章主要介绍了Java 线程池的相关资料,并符实例代码,帮助大家学习参考,需要的朋友可以参考下
    2016-09-09
  • 用Eclipse 创建一个简单的web项目(图文教程)

    用Eclipse 创建一个简单的web项目(图文教程)

    下面小编就为大家带来一篇用Eclipse 创建一个简单的web项目(图文教程)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • java实现注册登录系统

    java实现注册登录系统

    这篇文章主要为大家详细介绍了java实现注册登录系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Spring Security内置过滤器的维护方法

    Spring Security内置过滤器的维护方法

    这篇文章主要介绍了Spring Security的内置过滤器是如何维护的,本文给我们分析一下HttpSecurity维护过滤器的几个方法,需要的朋友可以参考下
    2022-02-02
  • Java方法的参数传递机制详解

    Java方法的参数传递机制详解

    这篇文章主要介绍了Java方法的参数传递机制详解,对于Java初学者来说,刚学习Java的时候可能经常会听到调用方法时参数的值传递与引用传递,但是,实际上Java中方法的参数传递机制只有值传递,需要的朋友可以参考下
    2024-01-01
  • 剑指Offer之Java算法习题精讲数组与字符和等差数列

    剑指Offer之Java算法习题精讲数组与字符和等差数列

    跟着思路走,之后从简单题入手,反复去看,做过之后可能会忘记,之后再做一次,记不住就反复做,反复寻求思路和规律,慢慢积累就会发现质的变化
    2022-03-03
  • MyBatis中模糊查询使用CONCAT('%',#{str},'%')出错的解决

    MyBatis中模糊查询使用CONCAT('%',#{str},'%')出错的解

    这篇文章主要介绍了MyBatis中模糊查询使用CONCAT('%',#{str},'%')出错的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 关于Java的HashMap多线程并发问题分析

    关于Java的HashMap多线程并发问题分析

    HashMap是采用链表解决Hash冲突,因为是链表结构,那么就很容易形成闭合的链路,这样在循环的时候只要有线程对这个HashMap进行get操作就会产生死循环,本文针对这个问题进行分析,需要的朋友可以参考下
    2023-05-05

最新评论