AOP-Springフレームワークの基本原則

AOPとは

1. AOPとは
(1)AOPを使用するアスペクト指向プログラミング(アスペクト)は、ビジネスロジックのさまざまな部分を分離できるため、ビジネスロジックのさまざまな部分間の結合を減らし、プログラムの再利用性を向上させ、開発効率。
(2)一般的な説明:ソースコードを変更せずにメイン関数に新しい関数を追加します
(3)ログイン例を使用してAOPを説明します
ここに写真の説明を挿入

AOPの基本原則

動的プロキシには2つのケースがあります

  • インターフェイスがある場合はJDK動的プロキシを使用する
  • インターフェイスがない場合は、CGLIBを使用してください

(1)インターフェースがある場合は、JDK動的プロキシを使用します

インターフェイス実装クラスプロキシオブジェクトを作成し、クラスメソッドを拡張します
ここに写真の説明を挿入

(2)インターフェースがない場合は、CGLIB動的プロキシを使用してください

サブクラスのプロキシオブジェクトを作成し、クラスメソッドを拡張します
ここに写真の説明を挿入

JDKダイナミックプロキシの実現

ここに写真の説明を挿入

方法有三个参数:
第一参数,类加载器 
第二参数,增强方法所在的类,这个类实现的接口,支持多个接口 
第三参数,实现这个接口 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;
    }
}

おすすめ

転載: blog.csdn.net/weixin_44307065/article/details/107320443