发表于: 2017-09-11 23:39:09

3 721


今天完成的事
AOP概念
1.面向切面(方面)编程,扩展功能不修改源代码实现
2.AOP采取横向抽取机制,取代了传统继承体系重复性代码
举个例子,想User类添加日志功能
纵向抽取机制解决
public class BaseUser{
//创建日志添加的方法
public void writelog(){
//添加日志逻辑}
}
public class User extends BaseUser{
public void add(){
//添加逻辑
//功能扩展,添加日志的功能
//调用父类的方法实现日志功能
super.writelog()
}}
然而纵向抽取机制并不能根本解决,假如方法的父类方法的名字writelog变更了,子类中调用也要改变才行
横向抽取机制正是从纵向发展过来的
横向抽取机制
底层使用 动态代理方式实现
第一种情况 有接口的情况(使用jdk动态代理,针对有接口的情况)
public interface Dao{
public void add();}
public class DaoImpl implements Dao{
public void add(){
//添加逻辑}}
使用动态代理方式,创建接口实现类代理对象
创建和DaoImpl类平级对象
这个对象不是真正对象,而是代理对象,实现DaoImpl相同的对象
第二种情况 没有借口情况(使用cglib动态代理对象)
public class User{
public void add(){
//添加逻辑}}
思想:动态代理实现
创建User的子类的代理对象,在子类里面调用父类的方法完成增强
AOP术语
举个例子
public class User{
public void add(){}
public void update(){}
public void delete(){}
public void findAll(){}
}
Joinpoint(连接点):所谓连接点是指那些被拦截到的点.在spring中,这些点指的是方法,因为spring只支持方法类型的连接点,类里面的哪些方法可以被增强,这些方法被称为连接点
Pointcut(切入点):在类里面可以有很多方法被增强,比如在实际操作中,只是增强了类里面add方法和update方法,实际增强的方法称为切入点
Advice(通知/增强):增强的逻辑,称为增强,比如扩展日志的功能,这个日志功能称为增强
通知分为前置通知,后置通知,异常通知,最终通知,环绕通知
前置通知:在方法之前执行
后置通知:在方法之后执行
异常通知:方法出现异常
最终通知:在后置之后执行
环绕通知:方法之前和之后执行
Aspect(切面):把增强应用到具体方法上面,过程称为切面
把增强用到切入点过程
Introduction(引介):用动态方式向类里面加属性和加方法
Target(目标对象):要增强的类
Weaving(织入):把增强advice用到类target的过程
spring的aop操作
1.在spring里面进行aop操作,使用Aspectj实现
(1)Aspectj不是spring的一部分,和spring一起来使用来进行aop的操作
(2)spring2.0以后新增了对aspectJ支持
2.使用Aspectj实现aop操作
(1)基于aspectj的xml配置
(2)基于aspectj的注解方式
PS:什么是Aspectj?
Aspectj是一个面向切面的框架,他扩展了java语言.Aspectj定义了aop语法所以他有一个专门的编译器用来生成遵守java字节编码规范的Class文件.
额外知识点
什么是cglib动态代理对象?
JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。
明天计划的事
aspectj的aop配置,认识log4j,基于asceptj的注解aop操作,jdbcTemplate的crud操作
问题
收获
见今天完成的事



返回列表 返回列表
评论

    分享到