zoukankan      html  css  js  c++  java
  • 切入点表达式

    切入点表达式,

             可以对指定的“方法”进行拦截;  从而给指定的方法所在的类生层代理对象。

    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.loaderman.g_pointcut.OrderDao.save())" id="pt"/>-->
            <!--<aop:pointcut expression="execution(* loaderman.g_pointcut.UserDao.save()) or execution(* cn.loaderman.g_pointcut.OrderDao.save())" id="pt"/>-->
            <!-- 下面2个且关系的,没有意义 -->
            <!--<aop:pointcut expression="execution(* loaderman.g_pointcut.UserDao.save()) &amp;&amp; execution(* cn.loaderman.g_pointcut.OrderDao.save())" id="pt"/>-->
            <!--<aop:pointcut expression="execution(* loaderman.g_pointcut.UserDao.save()) and execution(* cn.loaderman.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>      

  • 相关阅读:
    多节点分布式监控 打造全新信息化港口——大连港集团有限公司
    多节点分布式监控 打造全新信息化港口——大连港集团有限公司
    Linux(Ubuntu)下设置golang环境变量
    刚毕业去面试Python工程师,这几道题太难了,Python面试题No11
    DBA的宿命(困兽之斗)
    AWS RDS强制升级的应对之道——版本升级的最佳实践
    如何使用pygame模块绘制一个窗口并设置颜色
    Java快速排序第二谈
    Ceph 的用户管理与认证
    Kubernetes:如何解决从k8s.gcr.io拉取镜像失败问题
  • 原文地址:https://www.cnblogs.com/loaderman/p/10042871.html
Copyright © 2011-2022 走看看