Java学習ノート06:Spring注記ベースAOP
5910 ワード
たとえば、このようなニーズでは、ユーザーの削除変更操作をログに書き込む必要があります.
一般的な方法は、ログのクラスを書き、すべての削除変更操作にログの書き込み方法を追加することです.しかし、このような弊害は、プログラムのすべての場所に削除・変更を加えた場所にこのログの書き込み操作を書く必要があることです.もしプログラムが非常に膨大であれば、私たちは死んでしまいましょう.
JavaのAOPはフェースプログラミング向けで、この気まずい問題をよく解決しました.私たちは独立したクラスを書くだけで、いくつかの注釈などの方法を経て、Springフレームワークは自動的に注釈に基づいてプログラムが実行されたときに私たちが上の追加削除変更操作にログ書き込み操作を加えるのを助けることができます.
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
">
<context:annotation-config/>
<aop:aspectj-autoproxy/>
<bean id="User" class="com.spring.user.User" ></bean>
<bean name="vip" id="vip" class="com.spring.user.Vip" ></bean>
<bean id="UserAop" class="com.spring.aop.UserAop" ></bean>
</beans>
package com.spring.aop;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
//@Aspect UserAop
@Aspect
public class UserAop {
//@Beafre com.spring.user.User userInfo()
//execution(public void com.spring.user.User.userInfo()) , beforeMethod
//
@Before("execution(public void com.spring.user.User.userInfo())")
public void beforeMethod() {
System.out.print("\r
AOP:Yes it's Before!\r
");
}
//@After com.spring.user.User sayUser()
// args(message) message
@After("execution(public void com.spring.user.User.sayUser()) && args(message)")
public void afterMethod(String message) {
System.out.print("Yes it's After" + message);
}
}
package com.spring.user;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.beans.factory.annotation.Autowired;
public class User {
private String username;
private int age;
private int phone;
@Autowired
private Vip vip;
public void setUsername(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void setPhone(int phone) {
this.phone = phone;
}
public int getPhone() {
return phone;
}
//com.spring.user.User userInfo
public void userInfo() {
System.out.print(" :" + this.username + "\r
"
+ " " + this.age + "\r
" + " :" + this.phone);
this.vip.say();
String message = "\r
AOP:this is args Message";
this.sayHello(message);
}
//com.spring.user.User sayHello
public void sayHello(String message) {
System.out.print(message);
}
@PostConstruct
public void init() {
System.out.printf("init a class");
}
@PreDestroy
public void destroy() {
System.out.print("destory a class");
}
}
package com.spring.main;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.user.User;
public class Index {
// , User userInfo
public static void main(String args[]) {
ApplicationContext Factory = null;
Factory = new ClassPathXmlApplicationContext("bean.xml");
User User = (User)Factory.getBean("User");
User.setUsername("zhuli");
User.setAge(100);
User.setPhone(138581025);
User.userInfo();
}
}
実行結果:
init a class
AOP:Yes it's Before!
:zhuli
100
:138581025I am Vip
AOP:this is args Message
を選択します.
説明
@Before
関数の実行前に実行
@AfterReturn
関数実行後に実行
@AfterThrow
関数がtrowのコードを実行した後に実行します
@After
関数に異常を投げ出し、finallyを実行した後に実行
@Around
詳細はBeforeとAfterReturn
≪インスタンス|Instance|emdw≫
説明
execution(public * * (..))
すべての方法がインプラントされていることを示します
execution(* set * (..))
すべてsetterメソッドにインプラント
execution(* com.spring.user. * (..))
comに植え込むspring.userパッケージ内のすべてのクラスの任意の方法
execution(* com.spring.user.User. * (..))
comに植え込むspring.user.Userクラス内のすべてのメソッド
// && ,args( )
@After("execution(public void com.spring.user.User.sayUser()) && args(message)")