1、aop概念
(1)aop:面向切面编程,扩展功能不修改源码实现
(2)aop采取横向抽取机制,取代传统的纵向继承体系重复性代码。
2、aop原理
4、底层实现演示
//接口类
public interface UserService {
void add();
void update();
void delete();
}
//实现类
public class UserServiceImpl implements UserService{
@Override
public void add(User user) {
// TODO Auto-generated method stub
System.out.println("add.....");
}
@Override
public void update(User user) {
// TODO Auto-generated method stub
System.out.println("update.....");
}
@Override
public void delete(Integer id) {
// TODO Auto-generated method stub
System.out.println("delete.....");
}
}
//切面类
public class MyAspect {
public void before(){
System.out.println("before....");
}
public void after(){
System.out.println("after....");
}
}
/**
* 工厂类,在spring中已经帮我们封装好
* 主要作用是:利用代理对象,对对象中的方法进行增强
**/
public class MyBeanFactory {
public static UserService createService() {
// 目标类
final UserService userService = new UserServiceImpl();
final MyAspect myAspect = new MyAspect();
/**
* 生成并返回一个代理类
* 参数1:类加载器
* 参数2:代理类需要的所有接口,目标类实例,getClass().getInterface()
* 参数3:提供invoke方法,代理对象每次执行方法的时候都会调用一次invoke方法
**/
UserService proxyService = (UserService) Proxy.newProxyInstance(
//获取类加载器,随便一个类都可以,一般选择当前类
MyBeanFactory.class.getClassLoader(),
//获取目标对象的接口
userService.getClass().getInterfaces(),
//
new InvocationHandler() {
/**
* Object proxy:代理对象
* Method method:代理对象执行方法所调用的方法
* Object[] args:方法执行执行的实参
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
myAspect.before();
System.out.println("args:"+args.toString());
//要用一个对象接住
Object object = method.invoke(userService, args);
myAspect.after();
return object;
}
});
return proxyService;
}
}