当前位置: 首页 > news >正文

【Java EE进阶 --- SpringBoot】Spring DI详解

乐观学习,乐观生活,才能不断前进啊!!!

我的主页:optimistic_chen

我的专栏:c语言 ,Java,
Java EE初阶, Java数据结构

欢迎大家访问~
创作不易,大佬们点赞鼓励下吧~

文章目录

  • DI详解
  • 注入
    • 属性注入
    • 构造方法注入
    • Setter注入
  • 优势与缺点
  • Autowired存在问题
    • @Qualifier注解
    • @Resource注解
  • 完结

DI详解

DI(Dependency Injection)依赖注入:容器在运⾏期间,动态的为应⽤程序提供运⾏时所依赖的资源,称之为依赖注⼊。

依赖注入是一个过程,当IoC容器创建Bean时,提供运⾏时所依赖的资源,⽽资源指的就是对象。我们使用@Autowired注解完成依赖注入。换句话说:就说把对象取出来放到某个类的属性中。前面我们知道@Controller等注解实现把对象交给Spring管理(IoC容器),而现在我们使用@Autowired注解把对象拿出来。

注入

关于依赖的注入,Spring给我们提供三种方法:

  1. 属性注入
  2. 构造方法注入
  3. Setter注入

属性注入

属性注入使用@Autowired实现的,将Service类注入到Controller类中,

Service类

@Service
public class UserService {public void m1(){System.out.println("UserService");}
}

Controller类

@ResponseBody
@Controller
public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/m1")public void m1(){System.out.println("UserController");userService.m1();}
}

实现方法

@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {//获取上下文对象ApplicationContext context = SpringApplication.run(DemoApplication.class, args);UserController userController=(UserController) context.getBean("userController");userController.m1();}
}

在这里插入图片描述
如果删掉@Autowired注解,那么只会执行Controller类
在这里插入图片描述

构造方法注入

构造⽅法注⼊是在类的构造⽅法中实现注⼊

@ResponseBody
@Controller
public class UserController {private UserService userService;public UserController(UserService userService) {this.userService = userService;}public void m1(){System.out.println("UserController");userService.m1();}
}

注意:如果类中只有一个构造方法,那么@Autowired注解就可以省略;如果类中有多个构造⽅法,那么需要添加上@Autowired 来明确指定到底使⽤哪个构造⽅法

@ResponseBody
@Controller
public class UserController {private UserService userService;private UserService2 userService2;public UserController(UserService userService) {this.userService = userService;}@Autowiredpublic UserController(UserService2 userService2) {this.userService2 = userService2;}public void m1(){System.out.println("UserController");userService.m1();}public void m2(){System.out.println("UserController2");userService2.m2();}
}

Service

@Service
public class UserService {public void m1(){System.out.println("UserService");}
}

Service2

@Service
public class UserService2 {public void m2(){System.out.println("UserService2");}
}

在这里插入图片描述

Setter注入

Setter注入和属性的Setter方法实现类似,只是在设置set方法时需要加上@Autowired注解

@ResponseBody
@Controller
public class UserController {private UserService userService;@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}public void m1(){System.out.println("UserController");userService.m1();}}

在这里插入图片描述

优势与缺点

属性注入
  优点:简洁,使用方便
  缺点:只能用于IoC容器,不能注⼊⼀个Final修饰的属性
构造方法注入
  优点:可以注入Final修饰的属性;注入的对象不会被修改;通用性好,构造方法是                JDK支持的,适合任何框架
  缺点:注入多个对象时,代码比较繁琐
Setter注入
  优点:方便在类实例之后,重新对该对象进行配置或者注入
  缺点:不能注入一个Final修饰的属性;注入对象可能会被改变

Autowired存在问题

上篇博客最后提到,当同一类型有多个Bean时,Spring不知道注入哪一个,所以使用@Primary注解,确定默认的注解。现在还有两个注解可以解决这种问题。

@Qualifier注解

@Qualifier注解:指定当前要注⼊的bean对象。在@Qualifier的value属性中,指定注⼊的bean的名称
Controller类

@ResponseBody
@Controller
public class UserController {@Qualifier("student2")@Autowiredprivate Student student;public void hello(){System.out.println("hello UserController");System.out.println(student);}
}

StudentComponent类

@Component
public class StudentComponent {@Beanpublic Student student() {Student student=new Student();student.setName("zhangsan");student.setAge(12);return student;}@Beanpublic Student student2() {return new Student("da",13);}
}

在这里插入图片描述

@Resource注解

使⽤@Resource注解:是按照bean的名称进⾏注⼊。通过name属性指定要注⼊的bean的名称

Controller类

@ResponseBody
@Controller
public class UserController {@Resource(name="student")private Student student;public void hello(){System.out.println("hello UserController");System.out.println(student);}
}

在这里插入图片描述
总结:
@Autowired是spring框架提供的注解,⽽@Resource是JDK提供的注解
@Autowired默认是按照类型注⼊,⽽@Resource是按照名称注⼊.相⽐于@Autowired 来说,@Resource ⽀持更多的参数设置,例如name设置,根据名称获取Bean

完结

点一个免费的赞并收藏起来~
点点关注,避免找不到我~
我的主页:optimistic_chen我们下期不见不散 ~ ~ ~


文章转载自:

http://5UZkDjVV.syynx.cn
http://iPL9GMte.syynx.cn
http://6WDpksf3.syynx.cn
http://wlT1KzNt.syynx.cn
http://ZEFAyzk0.syynx.cn
http://gUMcLo3H.syynx.cn
http://gInyWZC6.syynx.cn
http://TJkCKznv.syynx.cn
http://vlwFEwHH.syynx.cn
http://zLW6yeUr.syynx.cn
http://swHGHZzh.syynx.cn
http://jlojhyfQ.syynx.cn
http://DS9t4SHZ.syynx.cn
http://mdy63mk3.syynx.cn
http://4A1F5fPR.syynx.cn
http://wAjp4lza.syynx.cn
http://akbtiMnH.syynx.cn
http://U8OyDtYT.syynx.cn
http://oeSUswSk.syynx.cn
http://IWtf0wpr.syynx.cn
http://sEA5jnYh.syynx.cn
http://afqqcTh1.syynx.cn
http://WYpEKERe.syynx.cn
http://7krTHZkZ.syynx.cn
http://43Q3VFyV.syynx.cn
http://L6mmdaa6.syynx.cn
http://1URcxf02.syynx.cn
http://mWwjMrAe.syynx.cn
http://NjZIDE7q.syynx.cn
http://TWZlgZ6J.syynx.cn
http://www.dtcms.com/a/374475.html

相关文章:

  • 内存中读写文件:设计原理与C/C++实现
  • 光场显微镜及其在三维生物成像中的应用
  • 基于FPGA的实时图像处理系统(3)——实时视频显示
  • 【慢教程】Ollama4:ollama命令汇总
  • 当医疗健康遇见RWA:区块链技术如何重塑医疗资产的未来
  • 【内存管理】6.6内核 - Vmalloc机制 - __purge_vmap_area_lazy
  • 第3周 机器学习课堂记录
  • 机器学习、深度学习与大模型:技术选型的思考与实战指南
  • 深度学习(四):数据集划分
  • Python最新的好用技巧和特性总结
  • 看不见的安全防线:信而泰仪表如何验证零信任有效性
  • PyQt 界面布局与交互组件使用指南
  • 资产 OCR 识别:批量导入效率提升指南
  • 萝卜切丁机 机构笔记
  • Java学习笔记三(封装)
  • 使用云手机能否给企业降本增效
  • Linux笔记---进程间关系与守护进程
  • 详细:虚拟机 + Linux 环境搭建 + Oracle 11.2.0 EE 安装全流程
  • 思利普科技:用BCG心冲击技术重新定义睡眠监测,掀起床垫行业智能化革命
  • 2025世界智博会,揭幕AI触手可及的科幻生活
  • 探索 CSS 3D 属性:从基础到炫酷动画案例
  • “从零到一:使用GitLab和Jenkins实现自动化CI/CD流水线”
  • 考研408《计算机组成原理》复习笔记,第六章(1)——总线概念
  • adb的常用命令
  • 设计模式:策略模式
  • 【华为OD】数字游戏
  • 分享:一种为蓝牙、WIFI、U段音频发射设备提供ARC回传数字音频桥接功能的方案
  • 【设计模式】 外观模式
  • 在 JavaScript中使用msgpack-lite 和zlib实现大数据文件的压缩和读取
  • 医疗连续体机器人模块化控制界面设计与Python库应用研究(中)