aop采用了横向抽取机制,取代了传统的纵向机制。
底层实现:动态代理方式
什么是纵向抽取机制?
例子:
public class User {
//添加用户
public void add() {
//添加逻辑
//---------修改源代码,添加日志逻辑---------
}
}
扩展功能:
添加用户数据后,添加日志功能(记录在什么时间添加哪个用户)
纵向抽取机制解决:
public class BaseUser {
//创建日志添加的方法
public void writeLog() {
//添加日志逻辑
}
}
public class User extends BaseUser {
public void add() {
//添加逻辑
//功能拓展,添加日志功能,调用父类方法实现日志功能
super.writeLog();
}
}
如果父类的方法名称发生变化,子类中调用的方法也需要变化
什么是横向抽取机制?
情况一:使用jdk动态代理,针对有接口情况
public interface Dao {
public void add();
}
public class DaoImpl implements Dao {
public void add() {
//添加逻辑
}
}
目的:增强add()方法
使用动态代理方式
创建 接口实现类代理对象,与DaoImpl类平级
实现和DaoImpl相同的功能
情况二:使用cglib动态代理,没有接口情况
public class User {
public void add() {
}
}
创建User类的子类的代理对象
在子类里面调用父类的方法完成增强
网友评论