AOP:面向切面编程,利用AOP对业务逻辑各个方面进行隔离,从而使业务逻辑的各个方面耦合度进行降低,提高代码的重用性,同时提高代码的使用效率。
底层原理:
分两种:
1.有接口通过jdk动态代理
2.没有接口通过CGLIB动态代理
JDK 动态代理具体实现
通过使用Proxy类的方法实现动态代理
(1)调用newProxyInstance方法
参数解释:
1.Proxy类的加载器
2.增强方法的所在的类的接口(直接多接口)
3.实现代理对象,写增强的部分的一个接口
具体代码实现:
1.创建接口,定义方法
public interface UserDao(){
public int add(int a,int b);
}
2.创建接口实现类
public class UserDaoImpl implements UserDao {
@Override
public int add(int a, int b) {
return a+b;
}
}
3.使用Proxy创建代理对象
public class JDKProxy {
public static void main(String[] args) {
//创建接口实现类对象
UserDaoImpl userdaoImpl=new UserDaoImpl();
//userDao的字节码文件
Class[ ] class={UserDao.class};
UserDao dao=
(UserDao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),class,new UserDaoProxy(userdaoImpl));
int result = dao.add(1, 2);
System.out.println("result:"+result);
}
//创建代理对象代码
class UserDaoProxy implements InvocationHandler {
//1 把创建的是谁的代理对象,把谁传递过来
//有参数构造传递
private Object obj;
public UserDaoProxy(Object obj) {
this.obj = obj;
}
//增强的逻辑
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws
Throwable {
//方法之前
System.out.println("方法之前执行...."+method.getName()+" :传递的参
数..."+ Arrays.toString(args));
//被增强的方法执行
Object res = method.invoke(obj, args);
//方法之后
System.out.println("方法之后执行...."+obj);
return res;
} }