0


[SpringIoC&DI]一文带你了解关于Spring如何管理对象及对对象的注入

在这里插入图片描述

🌈个人主页:努力学编程’
个人推荐
c语言从初阶到进阶
JavaEE详解
数据结构
学好数据结构,刷题刻不容缓:点击一起刷题
🌙心灵鸡汤总有人要赢,为什么不能是我呢
在这里插入图片描述

💓💓💓什么是 Spring

关于Spring可能我们在很多地方都有听过,它是我们javaweb开发中的非常重要的一个框架,今天就来给大家简单介绍一下关于Spring的一些知识,首先我们打开spring的官网,看看官方是怎么介绍spring的.

spring官网
Spring makes programming Java quicker, easier, and safer for everybody. Spring’s focus on speed, simplicity, and productivity has made it the world’s most popular Java framework.

简单给大家翻译一下: 这里是说spring可以使你的java项目变得更快,更方便,更安全,更简单,并且非常不谦虚的说,spring是世界上最受欢迎的java框架,哈哈哈(LOL)…

这里其实主要还是说的是spring的特点,简单来说spring就是一个集合了许多方法和工具的IoC容器.
ok,那么什么事IoC容器呢???
在这里插入图片描述

💓💓💓springIoC

容器在我们的日常生活中非常常见,比如水杯,u盘,碟子,口袋…总之就是可以存放东西的物体.
关于springloc,其实如果你之前有了解过一些关于spring的知识,比如注解就是通过@contrller形式,加到类的上面,将这个类交给spring进行管理.(这里只是给大家举例个例子,注解有很多我们后面进行介绍),就是将这个类的管理交给了spring进行管理,用的时候直接用就行.

在这里插入图片描述

此外关于IoC它的具体翻译是: 控制翻转如何理解呢,举个例子:现在出现了自动驾驶技术,之前汽车的驾驶是由驾驶员进行管理的,后面将管理权交给系统.这,就叫控制翻转,此处我们将对象的管理权限交给了spring进行管理.

在这里插入图片描述

💓💓💓DI

我们上面也说过了,我们可是使用IoC将对象进行管理,那么想要使用容器中的对象,我们就需要使用依赖注入(DI),将对象注入到程序的当中.

在这里插入图片描述
这里可以简单理解为:
IoC是将对象交给spring管理,DI是将这些对象拿出来使用.

💓💓💓实现 loC容器

💕💕💕controller

@Controller// 将对象存储到 Spring 中publicclassUserController{publicvoidsayHi(){System.out.println("hi,UserController...");}}

那么如何从spring容器中获取对象呢

@SpringBootApplicationpublicclassSpringIocDemoApplication{publicstaticvoidmain(String[] args){//获取Spring上下⽂对象ApplicationContext context =SpringApplication.run(SpringIocDemoApplication.class, args);//从Spring上下⽂中获取对象UserController userController = context.getBean(UserController.class);//使⽤对象
 userController.sayHi();}}

程序开发⼈员不需要为bean指定名称(BeanId), 如果没有显式的提供名称(BeanId),Spring容器将为该
bean⽣成唯⼀的名称.
命名约定使⽤Java标准约定作为实例字段名. 也就是说,bean名称以⼩写字⺟开头,然后使⽤驼峰式
⼤⼩写.

⽐如
类名: UserController, Bean的名称为: userController
类名: AccountManager, Bean的名称为: accountManager
类名: AccountService, Bean的名称为: accountService

ApplicationContext VS BeanFactory的区别???
获取bean对象, 是⽗类BeanFactory提供的功能
ApplicationContext VS BeanFactory(常⻅⾯试题)
• 继承关系和功能⽅⾯来说:Spring 容器有两个顶级的接⼝:BeanFactory 和
ApplicationContext。其中 BeanFactory 提供了基础的访问容器的能⼒,⽽
ApplicationContext 属于 BeanFactory 的⼦类,它除了继承了 BeanFactory 的所有功能之外,
它还拥有独特的特性,还添加了对国际化⽀持、资源访问⽀持、以及事件传播等⽅⾯的⽀持.
• 从性能⽅⾯来说:ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象,⽽
BeanFactory 是需要那个才去加载那个,因此更加轻量. (空间换时间)

除此之外,还有很多其他的类注解: 他们的功能都差不多.

@Controller
@Service
@Reposity
@ Configuration
@Component(组件存储)

那么为啥搞这么多的注解呢:

  • @Controller:控制层, 接收请求, 对请求进⾏处理, 并进⾏响应. • @Servie:业务逻辑层, 处理具体的业务逻辑. • @Repository:数据访问层,也称为持久层. 负责数据访问操作 • @Configuration:配置层. 处理项⽬中的⼀些配置信息.

我们在公司做项目或者自己搞一些自己的项目的时候,由于代码量非常大,做好代码分类非常重要,对于不同的功能的包我们需要添加他们特有的注解,这也是分层的一种体现.

在这里插入图片描述

并且这些注解之间的关系,我们翻看源码的话,就会发现,其他注解都是依据Component实现的

💕💕💕为啥添加了注解却无法获取对象

这与Spring的扫描路径有关,我们Spring默认会在启动类的父级下的子文件进行扫描,如果我们将启动类和添加了注解的放到了不同的父级文件之中想要获取添加了注解的类,直接启动是会报错的.

我们可以通过手动配置启动类的扫描范围:
即在启动类中添加@ComponentScan({“父级文件”})注解,来指定Spring的扫描范围.

@ComponentScan({"com.example.demo"})@SpringBootApplicationpublicclassSpringIocDemoApplication{publicstaticvoidmain(String[] args){//获取Spring上下⽂对象ApplicationContext context =SpringApplication.run(SpringIocDemoApplication.class, args);//从Spring上下⽂中获取对象User u1 =(User) context.getBean("u1");//使⽤对象System.out.println(u1);}}

我们说了如何将对象交给Spring进行管理,那么我们在其他的类中,注入添加注解的类呢,这里我们最常用的是@Autowired 注入类.

但是 @Autowired 有时也会出现问题比如我们要添加多个对象的时候,使用类名是无法区分开的,直接启动也会报错.

这里提供了几种解决方案,其中比较重要的是实用@Resource注解,通过给里面添加对象名的方式将多个对象区分开.

同时,这里就衍生出了一道面试题: @Autowired 和 @Resource 的区别是什么???

@Autowired 默认是按照类型注⼊,⽽@Resource是按照名称注⼊.
@Autowired 是spring框架提供的注解,⽽@Resource是JDK提供的注解

标签: spring java 后端

本文转载自: https://blog.csdn.net/2301_76249062/article/details/143927056
版权归原作者 SKY_30 所有, 如有侵权,请联系我们删除。

“[SpringIoC&DI]一文带你了解关于Spring如何管理对象及对对象的注入”的评论:

还没有评论