Spring IOC与DI核心解析
Spring IOC(控制反转)
我们将一些任务(比如创建对象)交给了spring来进行集中管理,而这些任务本来是由我们来做的,所以控制权反转了。
Spring DI(注入)
我们将IOC中的一些依赖对象注入到当前对象
那讲了这么多怎么用呢?
这就需要了解到Bean的存储
其实我们将任务放入IOC容器的这一操作,也可以叫做Bean存储
两类注解可以实现:
1.类注解
@Controller @Service @Respository @Component @Configuration
2.方法注解
@Bean
我们没法直观的看到IOC容器是否有这个对象
可以通过一些方法来获得这个对象来测试
UserController类(注意我们是加了注解的)
我们的重点在于context,它表示上下文,我们通过getBean方法得到了依赖对象,该方法是通过类来获取的
其他获取方法
通过bean名来查找是如果原来的名字第一个字母是大写,则查找时要转为小写
如果第一个字母和第二个都是大写,则不用转为小写
通过bean名称来获取
通过bean名称和类型来查找
其他的注解不再依次进行举例基本都只是改一个注解就行
为什么要有这么多的注解?
应用分层
当我们查看这些注解的源码就会发现,他们里面都会有一个@Component注解,这就说明其他注解都是@Component注解的衍生类,至于为什么要细分,因为后面的应用类越来越多,不进行划分就会导致修改代码的成本很大
方法注解@Bean
类注解是添加到类上的,但有的时候,我们并不需要一个类,而是需要一个已经设计好的对象或者其他的,这时候我们就需要用到方法注解了。
如果只是进行文字讲解对该概念并不会有一定的理解,还需要着重的看下用法
我们发现我们费劲巴拉的一顿操作却报错了,这里显示的是该类型的bean不只有一个,不能通过类去进行匹配,所以我们得用bean名进行匹配,我们细心看我们写的Bean注解就会发现,后面我加了几个参数,相当于改了它的名字,这样不就好找了嘛。
不知道各位有没有想过一个问题,启动类也就是 SpringiocApplication 它是怎么扫描到我的这些类的,实践是找到答案的不二之选
我将启动类放在setvice包中了,我们发现spring不认识我们的u1了,很显然没有扫描到,当我们把它放到com.包的时候没有这种情况,我是不是可以认为它的扫描路径是启动类当前所在的包中,显然查看源码后确实如此,由于只是了解,所以便没有必要真的去解析一下源码。
DI详解(重点)
属性注入有三种方式
我们创建了UserService类
1.属性注入
我们通过@Autowired注解方法将其注入
测试一下
2.构造方法注入
注意我们打印的时机,这是构造方法的一个优点,这在后面会说到
3.Setter方法注入
三种方法的优缺点
1.属性注入
优点:简洁,方便
缺点:
1.不能注入一个Final修饰的属性
2.只能用于IOC容器
2.构造方法注入
优点:
1.可以注入Final修饰的属性
2.注入的对象不能改变
3.依赖对象在使用之前一定会完全初始化,因为依赖是在类的构造方法中执行的,而构造方法是早在类加载阶段就要执行的
缺点:当注入的对象多时,代码会很繁琐
3.Setter方法注入
优点:
方便在类实例之后,重新对类进行配置或者注入
缺点:
1.注入的对象可能被改变,因为多次调用Setter方法就有可能有被修改的风险
2.不能注入一个Final修饰的属性
Autowired 存在的问题
我们创建了BeanConfig类
这是因为注入时发现有两个一样类型的Bean才报错的,跟之前的通过类型找Bean是一样的。
我们只需要通过名字来找。
我们现在有三种方法
1.Primary
默认获取到的Bean应该是这个
2.Quality
通过Bean名去查找
3.Resource
通过Bean名去查找
Autowired 与 Resource 的区别
1.Autowired 是属于Spring 的注解,而Resource是JDK提供的注解
2.Autowired是根据类型查找,而Resource是根据名称去查找的,因此相比于Autowired,Resource 可以进行更多的类型设置,比如名称设置
Spring, Spring Boot和SpringMVC的关系以及区别
Spring: 简单来说,Spring是⼀个开发应⽤框架, 是一个 轻量级、⼀ 站式、模块化的框架,其⽬的是⽤于简化企业级应⽤程序开发。
Spring MVC:SpringMVC是Spring的⼀个⼦框架,主要⽤于开发WEB应⽤和⽹络接⼝
Spring Boot: Spring Boot是对Spring的⼀个封装,为了简化Spring应⽤的开发⽽出现的
SpringMVC和SpringBoot都属于Spring,SpringMVC是基于Spring的⼀个 MVC框架,⽽SpringBoot是基于Spring的⼀套快速开发整合包