初見スプリング(十)

9574 ワード

spring代理のAOP代理
aop代理はspringの重いもので、ある時は面に向かってプログラミングすると言います.
aopプロキシは注釈構成とxml構成を使ってもいいです.まず注釈で構成します.
IUserDao.java
package cn.itcast.e_aop_anno;

//   
public interface IUserDao {
    void save();
}
UserDao.java
package cn.itcast.e_aop_anno;

import org.springframework.stereotype.Component;

/**
 *     
 * @author Jie.Yuan
 *
 */
@Component   //     
public class UserDao implements IUserDao{

    @Override
    public void save() {
        System.out.println("-----    :  !!!------"); 
    }
}
Order Dao.java
package cn.itcast.e_aop_anno;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

/**
 *     
 * @author Jie.Yuan
 *
 */
@Component("orderDao")   //     
@Scope("prototype")
public class OrderDao{

    public void save() {
        System.out.println("-----    :  !!!------");
    }
}
AOPエージェントの作成
package cn.itcast.e_aop_anno;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;


@Component
@Aspect  //          
public class Aop {

    //         :       ;            

    @Pointcut("execution(* cn.itcast.e_aop_anno.*.*(..))")
    public void pointCut_(){
    }

    //      :            
    @Before("pointCut_()")
    public void begin(){
        System.out.println("    /  ");
    }

    //   /    :             【              】
    @After("pointCut_()")
    public void after(){
        System.out.println("    /  ");
    }

    //      :              【       】
    @AfterReturning("pointCut_()")
    public void afterReturning() {
        System.out.println("afterReturning()");
    }

    //     :                    
    @AfterThrowing("pointCut_()")
    public void afterThrowing(){
        System.out.println("afterThrowing()");
    }

    //     :        
    @Around("pointCut_()")
    public void around(ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("   ....");
        pjp.proceed();  //       
        System.out.println("   ....");
    }

}
アプリ.java
package cn.itcast.e_aop_anno;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {

    ApplicationContext ac = 
        new ClassPathXmlApplicationContext("cn/itcast/e_aop_anno/bean.xml");

    //          ,spring     “JDK  ”
    @Test
    public void testApp() {
        IUserDao userDao = (IUserDao) ac.getBean("userDao");
        System.out.println(userDao.getClass());//$Proxy001  
        userDao.save();
    }

    //           , spring  “cglib  ”
    @Test
    public void testCglib() {
        OrderDao orderDao = (OrderDao) ac.getBean("orderDao");
        System.out.println(orderDao.getClass());
        orderDao.save();
    }

    @Deprecated
    //     :           ,              ,          。
    public void testApp2() {
        //     :        
        UserDao userDao = (UserDao) ac.getBean("userDao");
        System.out.println(userDao.getClass());//$Proxy001  
        userDao.save();
    }


    @Test
    public void testGetObj() throws Exception {
        OrderDao orderDao1 = (OrderDao) ac.getBean("orderDao");
        OrderDao orderDao2 = (OrderDao) ac.getBean("orderDao");

        System.out.println(orderDao1);
        System.out.println(orderDao2);

    }
}
bean.xml

    <context:component-scan base-package="cn.itcast.e_aop_anno">context:component-scan>

    
    <aop:aspectj-autoproxy>aop:aspectj-autoproxy>
最初のtest:
class cn.itcast.e_aop_anno.UserDao–コア業務:保存!!
第二のtest:
class cn.itcast.e_aop_anno.OrderDao
Enhancer ByCGLOIB
2235 e 357
前を折り返します
開始トランザクション/異常
—コア業務:保存!!――
折り返し後…
提出事務/クローズ
afterReturning()
第三のtest:これはだめです.
第四のtest:
[email protected]_aop_anno.OrderDao@1263db