AOP:
静态代理:
1.将业务抽象为接口
2.代理对象和被代理对象都实现该接口
3.代理对象持有被代理对象的引用,在执行具体核心业务时交由被代理对象完成
动态代理:1.jbk动态代理(只能代理接口)
2.cglib动态代理(只能代理类)
- Proxy类主要用来获取动态代理对象,
- InvocationHandler接口用来约束调用者实现
jbk动态代理
Proxy代理核心类
作用:对方法增强
1.直接修改源代码
2.把这需求封装到方法, 不修改调用方式
3.不修改源代码
CGLib与JDK动态代理的区别
- 原理
- java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
- 而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理
- JDK动态代理和CGLIB字节码生成的区别
- JDK动态代理只能对实现了接口的类生成代理,而不能针对类
- CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法,因为是继承,所以该类或方法最好不要声明成final
- 速度上
- 在jdk6以后sun公司对JDK动态代理进行优化,在调用次数较少的情况下,JDK代理效率高于CGLIB代理效率
- 只有当进行大量调用的时候,jdk6和jdk7比CGLIB代理效率低一点,但是到jdk8的时候,jdk代理效率高于CGLIB代理
AOP使用场景
- Authentication 权限管理
- Log 日志记录
- Transactions 事务处理
- Exception 异常处理
- safety control 安全控制
- Caching 缓存
- performance 性能统计 等等
***方面/切面(Aspect
) 通常是一个类,里面可以定义切入点和通知
***切入点(Pointcut
) 就是带有通知的连接点,在程序中主要体现为书写切入点表达式,负责往"什么地方"插入代码,"通知"负责插入"什么代码
5种通知节点
Before(前)
@
B
e
f
o
r
e
(
v
a
l
u
e
=
"
"
,
a
r
g
N
a
m
e
s
=
"
"
)
@Before(value = "", argNames = "")
@Before(value="",argNames="")
After-returning(返回通知)
After-throwing(抛出后)
Arround(周围)
After(finally)(最终通知)
AOP 面向切面
作用 对方法增强
- 直接修改源代码
- 把这需求封装到方法(改一处其他都改了)
- 在不修改源代码的,不修改调用方式情况下对方法增强 设计模式 代理模式
1 静态代理
1> 抽共同接口
2> 代理类跟被代理实现公共接口
3> 代理类要引用被代理的实例
2 动态代理
实现一对多
jdk 代理接口
cglib 代理类
动态代理
spring-aop
基于动态代理aop实现
对aspects支持
名词解释
-
切面
代理类 --> 水果刀 - 提取公共代码
-
切入点
在那些方法上执行增强的代码—>切猪脚的点
-
通知
在执行核心方法执行的时机 — > 在核心方法之前执行代码
- 前置通知
- 后置通知
- 异常通知
过程
1、 new 用到了Person.class,所以会先找到Person.class文件,并加载到内存中(用到类中的内容类就会被加载)
2、执行该对象的static代码块(静态初始块)。(如果有的话,给Person.class类进行初始化)
3、在堆内存中开辟空间,分配内存地址
4、在堆内存中建立对象特有属性,并进行默认初始化
5、对属性进行显示初始化(声明成员属性并赋值)
6、执行普通初始块
7、执行构造函数
8、将内存地址赋值给栈内存中的jack变量
结构图
[外链图片转存失败(img-Lrcr0g3F-1565786920084)(img/类的初始化过程.png)]
二、面向对象六大原则?
单一职责原则(Single-Resposibility Principle)。
对一个类而言,应该仅有一个引起它变化的原因。
开放封闭原则(Open-Closed principle)。
软件实体应该是可以扩展的,但是不可修改。
Liskov替换原则(Liskov-Substituion Principle)。
子类型必须能够替换掉它们的基类型。本原则和开放封闭原则关系密切,正是子类型的可替换性,才使得使用基类型模块无需修改就可扩充。
依赖倒置原则(Dependecy-Inversion Principle)。
抽象不应依赖于细节,细节应该依赖于抽象
接口隔离原则(Interface-Segregation Principle)。
多个专用接口优于一个单一的通用接口
良性依赖原则。
不会在实际中造成危害的依赖关系,都是良性依赖。