Java学習ノート06:Spring注記ベースAOP

5910 ワード

  • 注記ベースAOP
  • AOPは、フェースプログラミングを意味します.ソースコードを変更せずに、クラス内の関数にプログラムを動的に追加する技術的な実装方法です.
    たとえば、このようなニーズでは、ユーザーの削除変更操作をログに書き込む必要があります.
    一般的な方法は、ログのクラスを書き、すべての削除変更操作にログの書き込み方法を追加することです.しかし、このような弊害は、プログラムのすべての場所に削除・変更を加えた場所にこのログの書き込み操作を書く必要があることです.もしプログラムが非常に膨大であれば、私たちは死んでしまいましょう.
    JavaのAOPはフェースプログラミング向けで、この気まずい問題をよく解決しました.私たちは独立したクラスを書くだけで、いくつかの注釈などの方法を経て、Springフレームワークは自動的に注釈に基づいてプログラムが実行されたときに私たちが上の追加削除変更操作にログ書き込み操作を加えるのを助けることができます.
  • 注釈に基づく単純なAOP実装
  • は、追加の依存jarパケットaspectjrtを必要とする.jar,cglib-nodep-2.1_3.jar,aspectjweaver-1.6.7.jar,aopalliance.JAr、これらの依存パッケージは手動でダウンロードしてから、注釈でAOPを実現する必要があります.Springはこれらのサードパーティの拡張パッケージを持っていません.
  • Beanを構成する.xmlファイル.追加する必要があるのは、xmlns:aop="http://www.springframework.org/schema/aop",http://www.springframework.org/schema/aop     http://www.springframework.org/schema/aop/spring-aop-2.5.xsd,これは私たちのAOPのクラスです.
    <?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>
  • UserAopクラスの実装.
  • 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
  • AOP注記構文:
  • AOPの注釈方式の差は多くなく,@Before(execution(xxxxx))
  • 通知タイプ表:
    を選択します.
    説明
    @Before
    関数の実行前に実行
    @AfterReturn
    関数実行後に実行
    @AfterThrow
    関数がtrowのコードを実行した後に実行します
    @After
    関数に異常を投げ出し、finallyを実行した後に実行
    @Around
    詳細はBeforeとAfterReturn
  • 常用execution式
    ≪インスタンス|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)")