【框架篇】对象注入的三种实现方式

news/2024/11/24 10:59:13/

在这里插入图片描述

对象注入的实现

一,实现方式的使用

对象注入也可被称为对象装配,是把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 {//注入方式:属性注入@Autowiredprivate 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;@Autowiredpublic 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;@Autowiredpublic 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 框架中用于注入依赖的注解,它们有以下区别:

  1. 来源不同:
    • @Autowired 是 Spring 框架提供的注解,通过类型进行依赖注入。
    • @Resource 是 JavaEE 定义的注解,通过名称进行依赖注入。
  2. 注入方式不同:
    • @Autowired 默认按照类型匹配的方式进行注入,如果存在多个相同类型的实例,可以结合 @Qualifier 注解来指定具体实例。
    • @Resource 默认按照名称匹配的方式进行注入,它支持使用 nametype 属性来指定名称或类型进行匹配。
  3. 支持的类型不同:
    • @Autowired 支持通过构造方法注入、属性注入、Setter 注入的方式实现依赖注入。
    • @Resource 支持通过属性注入、Setter 注入的方式实现依赖注入,不支持构造方法注入。
  4. 应用范围不同:
    • @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 报错的解决方案有以下两个:

  1. 使用 @Resource(name="")
  2. 使用 @Qualifierr(value = "") 【搭配@Autowired使用】

结语

这就是本期博客的全部内容啦!如果有什么其他的问题无法自己解决,可以在评论区留言哦!

最后,如果你觉得这篇文章写的还不错的话或者有所收获的话,麻烦小伙伴们动动你们的小手,给个三连呗(点赞👍,评论✍,收藏📖),多多支持一下!各位的支持是我最大的动力,后期不断更新优质的内容来帮助大家,一起进步。那我们下期见!

在这里插入图片描述



http://www.ppmy.cn/news/942460.html

相关文章

丁磊进退之道《前程密码》

该进的时候进,该退的时候退。丁磊很清楚企业发展到什么阶段,自己就该扮演什么角色。从初中到大学,成绩普普通通;工作三年,业绩平平常常。但他却有一个从来不安分守己的性格……  2005年11月28日,网易公司…

网页版Rstudio︱RStudio Server多人在线协作开发

网页版Rstudio︱RStudio Server多人在线协作开发 想了解一下RStudio Server,太给力的应用,可以说成是代码分布式运行,可以节省时间,放大空间。 RStudio是一个非常优秀的R语言IDE。 RStudio除了在各种系统中有桌面版本外还有Server…

游戏是怎么赚钱的 - 聊聊黑产

我猜今天这篇访问量会比较多。 其实一般情况下不太爱写这种文章,简单说就一点,这个行业的人我惹不起。 1、外挂 所谓外挂,是指通过技术手段,提供辅助游戏的工具,方便玩家获得一些额外的能力; 这事我特意咨询…

(补题心路)——“盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛

不知道该摆出什么表情 别的比赛要脑细胞,这比赛要命 水题真的是送分送到家门口但是没有这个命去交。。 热身赛的时候只有最后十分钟左右可以挣扎着交题 正式比赛的话就是,比赛5小时,挂机4小时,延时1小时……(延时的…

传奇开服架设之地图索引编辑器以及安装问题排查教程

有朋友下载了地图安装出现黑屏或者花屏问题 ,如果出现了黑屏或者花屏 那么肯定是安装方面出现了问题! 讲解一下地图结构以便大家了解地图排查问题: 一张地图是由一个X.map文件和一个或多个Objects、SmTiles、Tiles文件组成。 X.map文件存放…

C++信息学奥赛题目归类:2007-2018年初赛普及组问题求解

2007 题目一 (子集划分)将n个数(1,2,…,n)划分成r个子集。每个数都恰好属于一个子集,任何两个不同的子集没有共同的数,也没有空集。将不同划分方法的总数记为S(n,r)。例…

【移动安全高级篇】————2、浅谈Android软件安全自动化审计

0x00 前言 随着移动互联网的发展,移动终端安全也越来越受到关注。特别是Android系统的崛起,互联网上的各类Andriod软件数量迅速上升。因Android系统是开源的,导致各种android恶意软件迅猛增加,成为手机系统的最大受害者。与此同时…

龙OL外网架设成功案例

文章目录 准备工作游戏服务流程介绍搭建步骤1. 服务端环境设置2. 网站及数据库搭建网站配置MySql数据库配置 3. 网站及服务端文件修改网站配置文件修改服务端配置文件修改 4. 启动服务端5. 客户端文件修改 最近想玩个老游戏,官方玩的不爽,某宝入手一个单…