SpringのAOP(8)


Springの伝統AOP
AOP:Springで定義されていない.AOP連盟の組織定義.Springでの通知:(拡張コード)
  • フロント通知org.springframe ework.aop.MethodBefore Advice*対象方法の実行前に強化
  • を実施する.
  • バックエンド通知org.springframe ebook.aop.AfterReturningAdvice*対象方法の実行後に強化を実施する
  • サラウンド通知org.aopalliance.intercept.MethodInterceptor*は、ターゲット方法の実行前後に強化を実施する
  • 異常投げ通知org.springframe ebook.aop.Throws Advice*メソッドに異常を投げた後に強化を実施する
  • .org.springframe ebook.aop.Introduction Interceptorに通知します.*ターゲットクラスにいくつかの新しい方法と属性を追加します.
  • Springのカットタイプ
  • Advisor:Spring中の伝統的なうどん.*Advisor:切点と通知グループがあります.*Asppect:複数の接点と複数の通知グループ.
  • Advisor:一般的なうどんを代表して、Advice自身はうどんで、目標種類のあらゆる方法をブロックします.
  • PointcutAdvisor:接点を持つうどんを代表して、ブロック対象種類のどの方法を指定できますか?
  • Introduction Advisor:引介面を代表して、案内通知に対して切面を使用する(把握を要求しない)
  • .
    SpringのAOPの開発
    あらゆる方法の強化に対して:(接点を持たないうどん)
  • 第一歩:Jarパッケージを導入する.*spring-aop-3.2.RELEASE.jar*come.sprigsource.org.aopalliance-1.0.jar
  • 第二ステップ:被代理人を作成する:*CustomerDaoインターフェース
  • package cn.spring3.demo3;
    /*   
    */
    public interface CustomerDao {
        public void add();
        public void update();
        public void delete();
        public void find();
    }
    
    *Cusstoemenr DaoImpl実現類
    package cn.spring3.demo3;
    
    /**
     * @author NOP
     *          
     */
    public class CustomerDaoImpl implements CustomerDao {
        public void add() {
            System.out.println("    ");
        }
        public void delete() {
            System.out.println("    ");
        }
        public void find() {
            System.out.println("    ");
        }
        public void update() {
            System.out.println("    ");
        }
    }
    
  • 第3ステップ:強化コードの作成:
  • package cn.spring3.demo3;
    import java.lang.reflect.Method;
    import org.springframework.aop.MethodBeforeAdvice;
    /**
     * @author NOP
     *     
     */
    public class MyBeforeAdvice implements MethodBeforeAdvice{
        /**
         * method:     
         * args:  
         * target:    
         */
        public void before(Method method, Object[] args, Object target)
                throws Throwable {
            // TODO Auto-generated method stub
            System.out.println("    ...");
        }
    }
    
  • 第4ステップ:生成エージェント:(構成生成エージェント)
  • *作成エージェントSpringはProxyFactoryBean類に基づいています.JDKを使用する動的エージェントまたはCGLOIBのエージェントを自動的に選択します.*属性:target:代理の対象となるproxyInterfaces:代理が実現するインターフェースが複数ある場合は以下のフォーマットで値を付けられます.proxyTarget Class:クラスエージェントに対してインターフェースではなく、trueに設定されますか?CGlibエージェントを使用してinterceptorNames:ターゲットに織り込むAdviicesingletonが必要です.戻りエージェントは単一の例ですか?デフォルトは一例のoptimizeです.trueに設定すると、CGlibを強制的に使用します.
    
        
        
        
    
        
        
    
        
        
            
            
            
            
            
            
            
        
        
    ステップ5:試験類の作成
    package cn.spring3.demo3;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4Cla***unner;
    
    @RunWith(SpringJUnit4Cla***unner.class)
    @ContextConfiguration("classpath:applicationContext.xml")
    public class SpringTest3 {
    
        @Autowired
        //@Qualifier("customerDao")//        ,        
        @Qualifier("customerDaoProxy")
        private CustomerDao customerDao;
        /*
         *         
         */
        @Test
        public void demo1(){
            customerDao.add();
            customerDao.delete();
            customerDao.find();
            customerDao.update();
        }
    }
        :
        ...
        
        ...
        
        ...
        
        ...
        
    接点のある面:(ターゲットオブジェクトに対するいくつかの方法で強化される)
  • PointcutAdvisorインターフェース:
  • Default PointcutAdvisorで最も一般的なカットタイプは、任意のPointcutとAdviceの組み合わせによってカット面
  • を定義することができます.
  • RegexpMethPoint Advisor構造正規表現の接点面
  • 第一歩:被代理人を作成します.*OrderDao
    package cn.spring3.demo4;
    /**
     * @author NOP
     *     
     */
    public class OrderDao {
        public void add() {
            // TODO Auto-generated method stub
            System.out.println("    ");
        }
        public void delete() {
            // TODO Auto-generated method stub
            System.out.println("    ");
        }
        public void find() {
            // TODO Auto-generated method stub
            System.out.println("    ");
        }
        public void update() {
            // TODO Auto-generated method stub
            System.out.println("    ");
        }
    }
    
    第二ステップ:強化クラスを作成する:
    package cn.spring3.demo4;
    import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;
    /**
     * @author NOP            
     */
    public class MyAroundAdvice implements MethodInterceptor {
        public Object invoke(MethodInvocation methodInvocation) throws Throwable {
            // TODO Auto-generated method stub
            System.out.println("     。。。");
            Object result = methodInvocation.proceed();//          
            System.out.println("     。。。");
            return result;
        }
    }
    ステップ3:生成エージェント:
    
        
        
        
        
        
        
            
            
            
            
            
            
            
        
        
        
        
            
            
            
            
            
            
        
        
    ステップ4:試験類の作成
    package cn.spring3.demo4;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4Cla***unner;
    
    @RunWith(SpringJUnit4Cla***unner.class)
    @ContextConfiguration("classpath:applicationContext.xml")
    public class SpringTest1 {
        @Autowired
        //@Qualifier("orderDao")//        ,        
        @Qualifier("orderDaoProxy")
        private OrderDao orderDao;
        /*
         *        
         */
        @Test
        public void demo1(){
            orderDao.add();
            orderDao.delete();
            orderDao.find();
            orderDao.update();
        }
    }
        :
         。。。
        
         。。。
        
        
         。。。
        
         。。。
    
    自動代理
  • 前の例では、各プロキシはProxyFactoryBeanを通じてカットめんプロキシに編入されており、実際に開発されたものの中で、非常に多くのBenがProxyFactoryBenを配置しており、開発維持量が大きい
  • .
  • 自動作成プロキシ(****は、後処理Beanに基づいてビーンを作成します.ビーンを生成することはプロキシです.)
  • BenName AutoProxyCreatorは、Bean名に基づいてプロキシを作成する
  • .
  • DefaultAdvisor AutoxyCreatorは、Advisor自身が含む情報に基づいてプロキシを作成します.
  • *AnnotationAwareAspect JAtoxyCreatorはビーン中のAsppectJ注解に基づいて自動代理を行う
  • .
    自動方式の代理店はカット面の強化がないです.
    
        
        
        
    
        
        
        
    
        
        
            
            
        
    試験種別の作成:
    package cn.spring3.demo5;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4Cla***unner;
    import cn.spring3.demo3.CustomerDao;
    import cn.spring3.demo4.OrderDao;
    
    /**
     * @author NOP
     *                
     */
    @RunWith(SpringJUnit4Cla***unner.class)
    @ContextConfiguration("classpath:applicationContext2.xml")
    public class SpringTest {
        @Autowired
        @Qualifier("orderDao")//      ,         
        private OrderDao orderDao;
        @Autowired
        @Qualifier("customerDao")
        private CustomerDao customerDao;
    
        @Test
        public void demo1(){
            orderDao.add();
            orderDao.delete();
            customerDao.find();
            customerDao.update();
        }
    }
        :
        ...
        
        ...
        
        ...
        
        ...
        
    
    自動方式の代行は接点のうどんの強化があります.
    
        
        
        
    
        
        
        
    
        
        
            
            
            
            
        
    
        
        
            
            
        
    試験種別の作成:
    package cn.spring3.demo5;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4Cla***unner;
    
    import cn.spring3.demo3.CustomerDao;
    import cn.spring3.demo4.OrderDao;
    
    /**
     * @author NOP
     *                
     */
    @RunWith(SpringJUnit4Cla***unner.class)
    @ContextConfiguration("classpath:applicationContext3.xml")
    public class SpringTest_1 {
        @Autowired
        @Qualifier("orderDao")
        private OrderDao orderDao;
        @Autowired
        @Qualifier("customerDao")
        private CustomerDao customerDao;
    
        @Test
        public void demo1(){
            orderDao.add();
            orderDao.delete();
            orderDao.update();
            orderDao.find();
    
            customerDao.add();
            customerDao.delete();
            customerDao.update();
            customerDao.find();
        }
    }
        :
        ...
        
        
        ...
        
        
        ...
        
        
        ...
        
        
    
    ProxyFactoryBeanによる代理と自動代理の区別?ProxyFactoryBean:まず、プロキシオブジェクトがあり、プロキシオブジェクトをプロキシクラスに入れてプロキシを生成します.自動プロキシは、後処理Beanに基づいています.Beanの生成過程でプロキシオブジェクトが生成され、プロキシオブジェクトを返します.