最前線に書きます
- 1.SpringAOP通知の6種類がいる限り、我々が実装対応のインターフェイスというクラスをカスタマイズすると、ありますが、それらはすべてしている
org.springframework.aop
パッケージに。 - 2.AOP接続点は、メソッド呼び出しとすることができるオブジェクトがインスタンス化されるとき、この方法は、クラスの初期化、自分自身を呼び出すが、SpringAOPすべてのメソッド呼び出し、単純な、最も有用
通知名 | インターフェース |
---|---|
アドバイスの前に | org.springframework.aop.MethodBeforeAdvice |
リアリターン通知 | org.springframework.aop.AfterReturningAdvice |
アドバイスを返送した後、 | org.springframework.aop.AfterAdvice |
アドバイスアラウンド | org.springframework.aop.MethodInterceptor |
異常の通知 | org.springframework.aop.ThrowsAdvice |
はじめにアドバイス | org.springframework.aop.IntroductionInterceptor |
ターゲットオブジェクトのpublicクラスを書きます
public class Person {
private String name;
public boolean saySomething(String something){
System.out.println("Pereson类中说了一句:"+something);
return true;//默认返回true
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
まず、事前の通知を作成する(つまり、ターゲット・メソッド呼び出しの実行前)
アドバイスは、メソッドに渡されたパラメータを変更することができ、そしてこの方法は、事前に通知することにより達成することができる認証のユーザーログインに、例外をスローすることによって実行を防ぐことができます前に、SpringSecurityだけということでした
1.例:メソッドを実行する前に、メッセージは、メソッド名を含むが、コンソール、次の受信パラメータ変更に書き込まれます。(記事の書かれた内容は、ほとんどのコード内のコメントを持っている、あなたはコードビューをダウンロードすることができ、比較的小さいです)
/**
* 前置通知类
*/
public class BeforeAdvice implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] objects, @Nullable Object o) throws Throwable {
//第一个参数是目标方法对象,第二个是参数,第三个是做为调用目标的object(这是personr实例)
//打印方法名
System.out.println("要执行的方法是:"+method.getName());
//修改参数为lyn4ever
objects[0]="lyn4ever";//我们修改成为了lyn4ever,所以打印出来的就是lyn4ever,而不是zhangsan
}
public static void main(String[] args) {
Person person = new Person();
ProxyFactory pf =new ProxyFactory();
pf.addAdvice(new BeforeAdvice());
pf.setTarget(person);
Person proxy = (Person) pf.getProxy();
//我这里传的参数是zhangsan,理论上它应该打印出来zhangsan
proxy.saySomething("zhangsan");
}
}
何も間違っている、私はzhangsanに入っていた、それは完璧を交換してパラメータが、lyn4everにAOP変更されます。
第二に、ポスト・リターン通知
接続点は、トップのような変更のパラメータは、戻り値を変更することはできませんとして明らかではありません(メソッド呼び出し)実行戻り、です。しかし、例外をスローすることができ、スタックに送信することができ、あなたはまた、他のメソッドを呼び出すことができます。
/**
* 后置返回通知
*/
public class AfterReturnAdvice implements AfterReturningAdvice {
@Override
public void afterReturning(@Nullable Object o, Method method, Object[] objects, @Nullable Object o1) throws Throwable {
/*
参数和前置通知是一样的
这个是在返回之后调用,因此,person中的saySomething会先打印,我们在这里修改的参数不起作任何作用
*/
System.out.println("调用的方法是:"+method.getName()+"这句是在saySomething之后");//这句是在saySomething之后
objects[0]="lyn4ever";//这句可以修参数,但是之前的方法已经执行过了,所以不起任何作用
System.out.println("我们修改了参数为:"+objects[0]+"但是没有任何用");//这时候这个参数并不会传到person.saysomething(),因为已经调用过了
}
public static void main(String[] args) {
Person person = new Person();
ProxyFactory pf = new ProxyFactory();
pf.addAdvice(new AfterReturnAdvice());//注意修改这个为当前类中的通知类
pf.setTarget(person);
Person proxy = (Person) pf.getProxy();
proxy.saySomething("zhangsan");
}
}
第三に、周りのアドバイス
で最もよく理解されたこの男は、コードの前またはメソッドの呼び出し後に実行することができます。前後のポストのコレクションのように見えますが、それは私たちが何も、変更、および事前通知がvoidを返すことができますので、その実装のinvokeメソッドの戻り値としてメソッドの戻り値は、オブジェクトではありません変更することができます規則の変更。我々は、ターゲットオブジェクト内の接続ポイントメソッドを呼び出すことはできません、そうであっても、我々は完全にこのメソッドのすべてのコードを修正しました。
public class MyMethodInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
return null;
}
}
この呼び出し()メソッドとは、以前のようにそれらのパラメータを提供しないが、この例では、呼び出しすることができるが
コードサンプル
/**
* 环绕通知
*/
public class MyMethodInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
//在这个invoation中有一切我们想要的方法相关
System.out.println("类名是:"+invocation.getThis().getClass().getName());
System.out.println("目标方法是:"+invocation.getMethod().getName());
Object[] arguments = invocation.getArguments();//这个就是参数
System.out.println("第一个参数 是:"+arguments[0]);
//我们修改第一个参数为lyn4ever
arguments[0]="lyn4ever";
invocation.proceed();//执行目标方法
System.out.println("这个是在之后执行的");
return false;//修改返回值
}
public static void main(String[] args) {
Person person = new Person();
ProxyFactory pf = new ProxyFactory();
pf.addAdvice(new MyMethodInterceptor());//注意修改这个为当前类中的通知类
pf.setTarget(person);
Person proxy = (Person) pf.getProxy();
boolean flag = proxy.saySomething("zhangsan");
System.out.println(flag);//方法本来是要返回true的
}
}
私たちは、この方法は、ターゲットの値を返す変更、見ることができます。