Springの中のAOPの下の階は原理を実現します.
3209 ワード
SpringにおけるAOPの下側実現原理:ダイナミックエージェント.
動的エージェントは、私の理解では、元の種類のオブジェクトメソッドのソースコードを変更しないで、エージェントを介して
オブジェクトの既存のオブジェクトメソッドの強化、すなわち既存のオブジェクトを拡張する機能です.
JDKダイナミックエージェントには、クラスとインターフェースが含まれています.
InvocationHandlerインターフェース:
public interface InvocationHandler{ public Object invoke(Object proxy、Method、Object[]args)throwable; }
パラメータの説明:
Object proxy:最終的に生成された代理例を指すが、一般的には使われない. Method method:呼び出す方法 Object[]args:メソッド呼び出しに必要なパラメータ
InvocationHandlerインターフェースのサブクラスを1つのエージェントの最終操作クラスとして想像することができます.
Proxy類:
Proxyクラスは、1つまたは複数のインターフェースのために、1つまたは複数のインプリメンテーションクラスを動的に生成することができ、このような操作方法を提供する.
public static Object newProxInstance(Class Loader loader,Class)[]interfaces, InvocationHandler h) throws IllagalAgMentException
パラメータの説明:
Class Loader loader:クラスキャリア Class>[]interfaces:すべてのインターフェースを得る InvocationHandler h:InvocationHandlerインターフェースのサブクラスの例を得る
Ps:クラスキャリア
ProxyクラスにおけるnewProxyInstance()方法にはClass Loaderクラスの実例が必要であり、Class Loaderは実際にはクラスのキャリアであり、Javaには主に以下の3種類のキャリアがある. Boost strap Class Loader:このキャリアはC++で作成されています.一般的な開発では見られないです. Extendsion Class Loader:拡張クラスのロードを行うために使用されます.一般的に対応するのはjre\lib\extディレクトリのクラスです. ApClass Loader:(デフォルト)クラスパス指定のクラスをロードして、最もよく使われるのは一種のキャリアです.
動的エージェントクラスのバイトコードは、プログラム実行時にJava反射機構によって動的に生成され、プログラマが手動でソースコードを作成する必要がない.動的エージェントクラスは、プログラミング作業を簡単にするだけでなく、ソフトウェアシステムの拡張可能性を高めている.Java反射メカニズムは、任意のタイプの動的エージェントクラスを生成することができるからである.
java.lang.reflectパッケージのProxy類とInvocationHandlerインターフェースは、動的な世代を生成するために提供されます.
クラス
の能力を持っています
例コード:
1.まずインターフェースを作成します.
動的エージェントは、私の理解では、元の種類のオブジェクトメソッドのソースコードを変更しないで、エージェントを介して
オブジェクトの既存のオブジェクトメソッドの強化、すなわち既存のオブジェクトを拡張する機能です.
JDKダイナミックエージェントには、クラスとインターフェースが含まれています.
InvocationHandlerインターフェース:
public interface InvocationHandler{ public Object invoke(Object proxy、Method、Object[]args)throwable; }
パラメータの説明:
Object proxy:最終的に生成された代理例を指すが、一般的には使われない. Method method:呼び出す方法 Object[]args:メソッド呼び出しに必要なパラメータ
InvocationHandlerインターフェースのサブクラスを1つのエージェントの最終操作クラスとして想像することができます.
Proxy類:
Proxyクラスは、1つまたは複数のインターフェースのために、1つまたは複数のインプリメンテーションクラスを動的に生成することができ、このような操作方法を提供する.
public static Object newProxInstance(Class Loader loader,Class)[]interfaces, InvocationHandler h) throws IllagalAgMentException
パラメータの説明:
Class Loader loader:クラスキャリア Class>[]interfaces:すべてのインターフェースを得る InvocationHandler h:InvocationHandlerインターフェースのサブクラスの例を得る
Ps:クラスキャリア
ProxyクラスにおけるnewProxyInstance()方法にはClass Loaderクラスの実例が必要であり、Class Loaderは実際にはクラスのキャリアであり、Javaには主に以下の3種類のキャリアがある. Boost strap Class Loader:このキャリアはC++で作成されています.一般的な開発では見られないです. Extendsion Class Loader:拡張クラスのロードを行うために使用されます.一般的に対応するのはjre\lib\extディレクトリのクラスです. ApClass Loader:(デフォルト)クラスパス指定のクラスをロードして、最もよく使われるのは一種のキャリアです.
動的エージェントクラスのバイトコードは、プログラム実行時にJava反射機構によって動的に生成され、プログラマが手動でソースコードを作成する必要がない.動的エージェントクラスは、プログラミング作業を簡単にするだけでなく、ソフトウェアシステムの拡張可能性を高めている.Java反射メカニズムは、任意のタイプの動的エージェントクラスを生成することができるからである.
java.lang.reflectパッケージのProxy類とInvocationHandlerインターフェースは、動的な世代を生成するために提供されます.
クラス
の能力を持っています
例コード:
1.まずインターフェースを作成します.
package com.ls.reflect.demo;
public interface StudentDao {
public abstract void login();
public abstract void regist();
}
2.もう一つのインターフェースの実装クラスを作成します.package com.ls.reflect.demo;
public class StudentDaoImpl implements StudentDao {
public void login() {
System.out.println(" ");
}
public void regist() {
System.out.println(" ");
}
}
3.InvocationHandlerインターフェースを実現するpackage com.ls.reflect.demo;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public Object bind(Object target){
// ,
this.target=target;
//
return Proxy.newProxyInstance
(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
// , ,
public Object invoke(Object proxy, Method met, Object[] arg2)
throws Throwable {
System.out.println(" ");
Object result=met.invoke(target, arg2);
System.out.println(" ");
return result;
}
}
4.テストコード:package com.ls.reflect.demo;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class StudentDemo {
public static void main(String[] args) {
StudentDao sd=new StudentDaoImpl();
sd.login();
sd.regist();
System.out.println("----------");
MyInvocationHandler handler=new MyInvocationHandler();
StudentDao proxy=(StudentDao)handler.bind(sd);
proxy.login();
proxy.regist();
}
}