1. 程式人生 > >切入點表示式

切入點表示式

切入點表示式,

         可以對指定的“方法”進行攔截;  從而給指定的方法所在的類生層代理物件。

package loaderman.g_pointcut;

import org.aspectj.lang.ProceedingJoinPoint;


// 切面類
public class Aop {

    public void begin(){
        System.out.println("開始事務/異常");
    }

    public void
after(){ System.out.println("提交事務/關閉"); } public void afterReturning() { System.out.println("afterReturning()"); } public void afterThrowing(){ System.out.println("afterThrowing()"); } public void around(ProceedingJoinPoint pjp) throws Throwable{ System.out.println(
"環繞前...."); pjp.proceed(); // 執行目標方法 System.out.println("環繞後...."); } }
package loaderman.g_pointcut;

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

public
class App { ApplicationContext ac = new ClassPathXmlApplicationContext("loaderman/g_pointcut/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(); } }
package loaderman.g_pointcut;

public interface IUserDao {
    void save();
}
package loaderman.g_pointcut;

import org.springframework.stereotype.Component;

/**
 * 目標物件
 * @author Jie.Yuan
 *
 */
public class OrderDao{

    public void save() {
        System.out.println("-----核心業務:儲存!!!------");
    }

}
package loaderman.g_pointcut;


/**
 * 目標物件
 *
 */
public class UserDao implements IUserDao{

    @Override
    public void save() {
        System.out.println("-----核心業務:儲存!!!------");
    }
}
<?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:p="http://www.springframework.org/schema/p"
    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.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
    
    <!-- dao 例項 -->
    <bean id="userDao" class="loaderman.g_pointcut.UserDao"></bean>
    <bean id="orderDao" class="loaderman.g_pointcut.OrderDao"></bean>
    
    <!-- 切面類 -->
    <bean id="aop" class="loaderman.g_pointcut.Aop"></bean>
    
    <!-- Aop配置 -->
    <aop:config>
        
        <!-- 定義一個切入點表示式: 攔截哪些方法 -->
        <!--<aop:pointcut expression="execution(* loaderman.g_pointcut.*.*(..))" id="pt"/>-->
        
        <!-- 【攔截所有public方法】 -->
        <!--<aop:pointcut expression="execution(public * *(..))" id="pt"/>-->
        
        <!-- 【攔截所有save開頭的方法 】 -->
        <!--<aop:pointcut expression="execution(* save*(..))" id="pt"/>-->
        
        <!-- 【攔截指定類的指定方法, 攔截時候一定要定位到方法】 -->
        <!--<aop:pointcut expression="execution(public * loaderman.g_pointcut.OrderDao.save(..))" id="pt"/>-->
        
        <!-- 【攔截指定類的所有方法】 -->
        <!--<aop:pointcut expression="execution(* loaderman.g_pointcut.UserDao.*(..))" id="pt"/>-->
        
        <!-- 【攔截指定包,以及其自包下所有類的所有方法】 -->
        <!--<aop:pointcut expression="execution(* loaderman..*.*(..))" id="pt"/>-->
        
        <!-- 【多個表示式】 -->
        <!--<aop:pointcut expression="execution(* loaderman.g_pointcut.UserDao.save()) || execution(* cn.itcast.g_pointcut.OrderDao.save())" id="pt"/>-->
        <!--<aop:pointcut expression="execution(* loaderman.g_pointcut.UserDao.save()) or execution(* cn.itcast.g_pointcut.OrderDao.save())" id="pt"/>-->
        <!-- 下面2個且關係的,沒有意義 -->
        <!--<aop:pointcut expression="execution(* loaderman.g_pointcut.UserDao.save()) &amp;&amp; execution(* cn.itcast.g_pointcut.OrderDao.save())" id="pt"/>-->
        <!--<aop:pointcut expression="execution(* loaderman.g_pointcut.UserDao.save()) and execution(* cn.itcast.g_pointcut.OrderDao.save())" id="pt"/>-->
        
        <!-- 【取非值】 -->
        <!--<aop:pointcut expression="!execution(* loaderman.g_pointcut.OrderDao.save())" id="pt"/>-->
        <aop:pointcut expression=" not execution(* loaderman.g_pointcut.OrderDao.save())" id="pt"/>
        
        <!-- 切面 -->
        <aop:aspect ref="aop">
            <!-- 環繞通知 -->
            <aop:around method="around" pointcut-ref="pt"/>
        </aop:aspect>
    </aop:config>
</beans>