AOPとは
1. AOPとは
(1)AOPを使用するアスペクト指向プログラミング(アスペクト)は、ビジネスロジックのさまざまな部分を分離できるため、ビジネスロジックのさまざまな部分間の結合を減らし、プログラムの再利用性を向上させ、開発効率。
(2)一般的な説明:ソースコードを変更せずにメイン関数に新しい関数を追加します
(3)ログイン例を使用してAOPを説明します
AOPの基本原則
動的プロキシには2つのケースがあります
- インターフェイスがある場合はJDK動的プロキシを使用する
- インターフェイスがない場合は、CGLIBを使用してください
(1)インターフェースがある場合は、JDK動的プロキシを使用します
インターフェイス実装クラスプロキシオブジェクトを作成し、クラスメソッドを拡張します
(2)インターフェースがない場合は、CGLIB動的プロキシを使用してください
サブクラスのプロキシオブジェクトを作成し、クラスメソッドを拡張します
JDKダイナミックプロキシの実現
- モジュールjava.base
- パッケージjava.lang.reflect
- クラスプロキシの詳細については、を参照してください。
方法有三个参数:
第一参数,类加载器
第二参数,增强方法所在的类,这个类实现的接口,支持多个接口
第三参数,实现这个接口 InvocationHandler,创建代理对象,写增强的部分
ステップ
(1)インターフェースを作成し、メソッドを定義します
(2)インターフェイス実装クラスを作成してメソッドを実装します
(3)Proxyクラスを使用してインターフェイスプロキシオブジェクトを作成します
- パラメータ化された構築メソッドは、拡張オブジェクトを渡します
- オブジェクト拡張を呼び出す
- コード
package com.LinXiaoDe.spring5;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
public class JDKProxy {
public static void main(String[] args) {
Class[] interfaces={
UserDao.class};
//1.类加载器
//2.增强方法所在的类,这个类实现的接口,支持多个接口
//3.实现这个接口 InvocationHandler,创建代理对象,写增强的部分
/*匿名内部类,可以写在内部
Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
});*/
UserDaoImpl userDao=new UserDaoImpl();
UserDao dao= (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces,new UserDaoProxy(userDao));
int res=dao.add(1,2);
System.out.println("result: "+res);
}
}
//创建代理对象,实现InvocationHandler,用于增强
class UserDaoProxy implements InvocationHandler {
//1.把创建是谁的代理对象,那么把谁传进来
//有参构造方式传入
private Object obj;
public UserDaoProxy(Object obj)
{
this.obj=obj;
}
//2.只要对象被创建,那么方法将会被调用
@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;
}
}