Spring:
(1)Bean线程安全问题
(2)AOP,事务原理,事务失败
(3)Bean的生命周期
(4)循环依赖
SpringMVC:
(1)执行流程
SpringBoot:
(1)自动装配原理
Mybatis:
(1)执行流程
(2)延迟加载
(3)一二级缓存
Spring框架概述
什么是Spring
Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为J2EE应用程序开发提供继承的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。Spring的核心是IOC(控制反转)和AOP(面向切面)。Spring是一个分层的JavaSE/EE full-stack(一站式)轻量级开源框架。
轻量级:对比EJB,以来资源少,销毁的资源少
一站式:每一个层都提供的解决方案
Spring优点
1.方便解耦,简化开发(高内聚低耦合),使用Spring的IOC容器,将对象之间的依赖关系交给Spring来管理,让我们能够更加专注于应用逻辑
2.Spring就是一个大工厂(容器),可以将所有对象创建和维护依赖关系,交给Spring管理
3.对主流的框架提供了很好的集成支持,如Hibernate,Struts,JPA等
4.Spring提供面向切面编程,可以方便的实现对程序进行权限拦截,运行监控等功能
5.Spring的高度可开放性,并不强制依赖于Spring,开发者可以自由选择Spring部分或全部
Spring体系结构
Spring框架是一个分层架构,Spring Framework是Spring生态圈中最基础的项目,是其他项目的根基:
核心容器(IOC/DI)
**(IOC)**原由:以前编写java代码的时候,代码耦合度偏高,导致项目维护起来非常麻烦。
解决方案:
使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象,这种思想就是(IOC)控制反转:使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想成为控制反转(解耦)。
Spring技术对IOC思想的实现:
(1)Spring提供了一个容器,称为IOC容器,用来充当IOC思想中的外部
(2)IOC容器负责对象的创建,初始化等一系列工作,被创建或被管理的对象在IOC容器中统称为Bean
**(DI)依赖注入:**在容器中建立bean和bean之间的依赖关系的整个过程,称为依赖注入。在IOC容器内将有依赖关系的bean进行关系绑定(DI)。最终使用对象时不仅可以直接从IOC容器中获取,并且获取到的bean已经绑定了所有的依赖关系
Bean的作用范围:
可用scope选择范围:(singleton:单例,prototype:非单例)
Bean第一种实例化方式,使用无参构造方法
Bean第二种实例化方式,使用静态工厂实例化bean
Bean第三种实例化方式,使用实例工厂实例化bean
Bean生命周期:
bean从创建到销毁的整个过程
初始化容器:
(1)创建对象(分配内存)
(2)执行构造方法
(3)执行属性注入(set操作)
(4)执行bean初始化方法
使用bean
(1)实行业务操作
关闭/销毁容器
(1)执行bean消费方法
面向切面编程AOP
AOP:通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等
AOP使用场景
拿我前面做过的一个项目举个例子吧,做的是一个公司的订餐系统,这个系统需要用到Shiro鉴权。
项目里面很多的接口,但是有的接口不需要鉴权就可以访问了,是开放的。
但是还有一些接口,需要特定权限的用户才能访问,比如说公司的领导的权限跟员工的权限不一样,还有系统管理员。
如果要用 OOP 处理的话,必须在对应的接口代码里面,一个一个写上鉴权的代码。
但是如果使用了AOP之后,写一个接口,在需要鉴权的接口上面添加一个注解即可解决了。这样的做法,对原有代码毫无入侵性,这就是AOP的好处了,把和主业务无关的事情,放到代码外面去做。
AOP优点
AOP同时还可以让我们层次话功能性而不是嵌入功能性,从而使得代码有更好的可读性和易于维护
AOP让我们在进行系统架构和模块设计的时候多了新的选择和新的思路
AOP核心概念
连接点(JoinPoint):程序执行过程中的任意位置,粒度为执行方法,抛出异常,设置变量等。在SpringAOp中理解为方法的执行
切入点(PointCut):匹配连接点的式子,在SpringAOP中,一个切入点可以只描述一个具体方法,也可以匹配多个方法。(1)一个具体方法:dao包下的dao接口中的无形参无返回值的save方法(2)匹配多个方法:所有的save方法,所有的get开头的方法,所有以Dao结尾的接口中的任意方法,所有带有一个参数的方法
通知:(Advice):在切入点处执行的操作,也就是共性功能。在SpringAOP中,功能最终以方法的形式呈现
前置通知:@Before 在目标业务方法执行之前执行
后置通知:@After 在目标业务方法执行之后执行
返回通知:@AfterReturning 在目标业务方法返回结果之后执行
异常通知:@AfterThrowing 在目标业务方法抛出异常之后
环绕通知:@Around 功能强大,可代替以上四种通知,还可以控制目标业务方法是否执行以及何时执行
通知类:定义通知的类
切面(Aspect):描述通知与切入点的对应关系
AOP实现原理
我们来看下代码的具体实现:
- 首先我定义了一个自定义注解作为切点
java
@Target(AnnotationTarget.FUNCTION) //注解作用的范围,这里声明为函数
@Order(Ordered.HIGHEST_PRECEDENCE) //声明注解的优先级为最高,假设有多个注解,先执行这个
annotation class Hanler(val handler: HandlerType) //自定义注解类,
// HandlerType是一个枚举类型,里面定义的就是学生和老师的增删改操作,在这里就不展示具体内容了
- 接下来就是要定义切面类了
java
@Aspect //该注解声明这个类为一个切面类
@Component
class HandlerAspect{
@Autowired
private lateinit var handlerService: HandlerService
@AfterReturning("@annotation(handler)") //当有函数注释了注解,将会在函数正常返回后在执行我们定义的方法
fun hanler(hanler: Hanler) {
handlerService.add(handler.operate.value) //这里是真正执行记录的方法
}
}
- 最后就是我们本来的业务方法了
java
/**
* 删除学生方法
*/
@Handler(operate= Handler.STUDENT_DELETE) //当执行到删除学生方法时,切面类就会起作用了,当学生正常删除后就会执行记录方法,我们就可以看到记录方法生成的数据
fun delete(id:String) {
studentService.delete(id)
}
AOP实现逻辑:
1.导入坐标(pom.xml)
2.制作连接点方法(原始操作,Dao接口与实现类)
3.制作共性功能(通知类与通知)
4.定义切入点
AOP实现原理
我们现在了解了代码中如何实现,那么AOP实现的原理是什么呢?之前看了一个博客说到,提到AOP大家都知道他的实现原理是动态代理,显然我之前就是不知道的,哈哈,但是相信阅读文章的你们一定是知道的。
讲到动态代理就不得不说代理模式了, 代理模式的定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式包含如下角色:subject:抽象主题角色,是一个接口。该接口是对象和它的代理共用的接口; RealSubject:真实主题角色,是实现抽象主题接口的类; Proxy:代理角色,内部含有对真实对象RealSubject的引用,从而可以操作真实对象。代理对象提供与真实对象相同的接口,以便代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的