您好,欢迎来到叨叨游戏网。
搜索
您的当前位置:首页[SpringIoC&DI]一文带你了解关于Spring如何管理对象及对对象的注入

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

来源:叨叨游戏网

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

💓💓💓什么是 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),将对象注入到程序的当中.

💓💓💓实现 loC容器

💕💕💕controller

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

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

@SpringBootApplication
public class SpringIocDemoApplication {
 public static void main(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"})
@SpringBootApplication
public class SpringIocDemoApplication {
 public static void main(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提供的注解

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.net 版权所有 湘ICP备2024080961号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务