1、IOC
参考:https://javadoop.com/post/spring-ioc
1.1、简介
- 控制反转,指创建对象的控制权交给spring框架管理,并由spring根据配置文件创建实列和管理实列之间的依赖关系。
- DI依赖注入,和控制反转是同一个概念不同角度的描述问题,在运行程序时,需要IOC容器来动态注入对象需要的外部依赖
- 使用java反射机制,在程序运行时动态的创建对象和管理对象
- IOC有四种构造方式,构造器注入、set方法注入、根据注解注入、接口注入
1.2、IOC的3种构造方式
参考:https://blog.csdn.net/a745233700/article/details/89307518
- 构造器注入
- set方法注入
- 注解方法注入
-
- Autowired按类型方式注入
- Resource默认按名称装配,找不到按名称装配才会按类型装配
- Quilifier和Autowired结合,按照指定bean名称装配
- 接口注入
1.3、xml注入方式
参考:https://blog.csdn.net/a745233700/article/details/89307518
- set方法注入
- 构造方法注入
- 实列方法注入
- 静态方法注入
2、AOP
2.1、简介
- 面向切面编程,用于那些与业务无关,但对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可复用的模块,这个模块叫切面。
- 优点:减少系统的重复代码、降低模块间的耦合度、提高系统的可维护性。常用于日志、权限认证、事务处理等模块
2.2、动态代理和静态代理
- AspectJ静态代理
-
- AOP框架会在编译阶段生成一个AOP代理类,并将AspectJ(切面)织入到java字节码中,在运行时,就会运行增强的AOP对象
- SpringBoot AOP动态代理
-
- 动态代理不会修改字节码文件,而是在内存中临时生成一个AOP对象,这个对象包含了目标对象的所有方法,并在特定的切点做了增强,回调原对象的方法。
- 区别
-
- Spring AOP属于运行时增强,AspectJ属于编译时增强,Spring AOP基于proxy代理增强,而AspectJ基于Java字节码增强,
- AspectJ运行更快,具有更好的性能,而Spring AOP操作更简单,Spring AOP已经集成了AspectJ。
2.3 JDK动态代理和CGLIB动态代理
- JDK动态代理
-
- JDK动态代理只提供对接口的代理,不提供对类的代理,要求被代理类实现接口。
- JDK动态代理的核心是invocationHandler接口和proxy类,使用proxy类来动态创建目标类的代理类(即最终的代理类,这个类继承自proxy,并实现了我们定义的接口)
- InvacationHandler通过invoke()方法反射调用目标类的方法,动态的将横切逻辑和业务编织在一起。
- CGLIB动态代理对象
-
- CGLIB(Code generation library) 是一个代码生成的类库,可以在运行时动态生成指定类的子类对象,并覆盖其中特定方法添加增强代码,从而实现AOP。
- CGLIB通过继承的方式实现动态代理,所以final类不能被代理。
2.4AOP常用名词概念
- 连接点(Join Point):指程序运行过程中所执行的方法,在spring AOP中一个连接点总代表一个方法的执行
- 切面(Aspect):被抽取出来的公共模块,可以用来横切多个对象,一般可由多个切点和通知组成。
- 切点(Pointcut):用于定义要对那些join point进行拦截
-
- execution:可以用路径表达式指定对那些方法进行拦截
- annotation:指定对那些注解修饰的代码进行拦截
- 通知(Advice):指在连接点执行的动作
- 织入(weaving):通过动态代理,对目标方法执行织入的过程
2.5、spring通知有那些类型
- 前置通知:在连接点之前通知
- 后置通知:在连接点推出的时候执行的通知(无论正常返回还是异常退出都执行)
- 环绕通知:包围一个连接点的通知, 环绕通知可以在方法调用前后完成自定义的行为。它也可以选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。
- 返回后通知:在连接点返回后通知,抛出异常则不执行
- 抛出异常后通知:在连接点抛出异常后通知