• Spring中配置aop (xml)


    只是为了方便翻阅做个一个笔记,有什么错误希望大家可以指出

    1、spring中 用xml配置aop

    1)目标对象

    package cn.itcast.service;
    
    public class UserServiceImpl implements UserService {
    
        @Override
        public void save() {
            // TODO Auto-generated method stub
            System.out.println("保存用户!!");
    
        }
    
        @Override
        public void update() {
            // TODO Auto-generated method stub
            System.out.println("修改用户!!");
    
        }
    
        @Override
        public void delete() {
            // TODO Auto-generated method stub
            System.out.println("删除用户!!");
    
        }
    
        @Override
        public void find() {
            // TODO Auto-generated method stub
            System.out.println("更新用户!!");
    
        }
    
    }

    2)通知对象

    package cn.itcast.advice;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    
    public class MyAdvice {
    
        //前置通知
        public void before(){
            System.out.println("这是前置通知!!!");
        }
        
        
        // 后置通知
        public void afterReturning(){
            System.out.println("这是后置通知(出现异常也会调用)!!!");
        }
        
        
        //环绕通知
        public Object around(ProceedingJoinPoint pjPoint) throws Throwable {
            System.out.println("这是环绕通知之前的部分!!!");
            Object proceed = pjPoint.proceed();  //调用目标方法
             System.out.println("这是环绕通知之后的部分!!!");
            return proceed;
        }
        
        
        //异常通知
        public void  afterException() {
            System.out.println("出现异常啦(出现异常不会调用)!!!!");
            
        }
        
        //后置通知
        public void  after() {
            System.out.println("这是后置通知(出现异常不会调用)!!!!");
            
        }
    }

    3)spring中aop的相关配置

    <!-- 准备工作  导入aop命名空间 -->
        
        <!-- 1、配置目标对象  -->
        <bean name="userServiceTarget" class="cn.itcast.service.UserServiceImpl"></bean>
        <!-- 2、配置通知对象  -->
        <bean name="myAdvice" class="cn.itcast.advice.MyAdvice"></bean>
        <!-- 3、配置将通知织入目标对象 -->
        <aop:config>
            <!-- 配置切入点    
            expression:切点表达式    * cn.itcast.service..*ServiceImpl.*(..) 
             *(返回值类型) cn.itcast.service.*ServiceImpl(以ServiceImpl结尾的任何类).*(..) (任何方法-任何参数)
               -->
            <aop:pointcut expression="execution(* cn..itcast.service.*ServiceImpl.*(..))" id="pc"/>
            <aop:aspect ref="myAdvice">
                <!-- 指定myAdvice中的before方法作为前置通知    pointcut-ref:切点的引用  -->
                <aop:before method="before" pointcut-ref="pc"/>
                <aop:after method="afterReturning" pointcut-ref="pc"/>
            </aop:aspect>
        </aop:config>

    4、测试demo

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:/cn/itcast/springaop/applicationContext.xml")  //指定spring的配置文件
    public class Test {
        
        //将容器中的 userService 注入到test中
        @Resource(name="userService")
        private UserService us;
        
        
        @org.junit.Test
        public void test1(){
            us.save();
        }
        
    }

    clipboard

    2、spring aop 的注解配置

    1)目标对象

    同上

    2)通知对象

    // 通知类
    @Aspect  
    // 表示该类是一个通知类
    public class MyAdvice {
    
        //前置通知
        //指定该方法是前置通知 , 并指定切入点
        @Before("execution(* cn..itcast.service.*ServiceImpl.*(..))")
        public void before(){
            System.out.println("这是前置通知!!!");
        }
        
        
        // 后置通知
        @AfterReturning("execution(* cn..itcast.service.*ServiceImpl.*(..))")
        public void afterReturning(){
            System.out.println("这是后置通知(出现异常也会调用)!!!");
        }
        
        
        //环绕通知
        @Around("execution(* cn..itcast.service.*ServiceImpl.*(..))")
        public Object around(ProceedingJoinPoint pjPoint) throws Throwable {
            System.out.println("这是环绕通知之前的部分!!!");
            Object proceed = pjPoint.proceed();  //调用目标方法
             System.out.println("这是环绕通知之后的部分!!!");
            return proceed;
        }
        
        
        //异常通知
        @AfterThrowing("execution(* cn..itcast.service.*ServiceImpl.*(..))")
        public void  afterException() {
            System.out.println("出现异常啦)!!!!");
            
        }
        
        //后置通知
        @After("execution(* cn..itcast.service.*ServiceImpl.*(..))")
        public void  after() {
            System.out.println("这是后置通知(出现异常不会调用)!!!!");
            
        }
    }

    3)xml配置

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://www.springframework.org/schema/beans" 
    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-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd ">
    
        <!-- 准备工作  导入aop命名空间 -->
        
        <!-- 1、配置目标对象  -->
        <bean name="userService" class="cn.itcast.service.UserServiceImpl"></bean>
        <!-- 2、配置通知对象  -->
        <bean name="myAdvice" class="cn.itcast.annotationaop.MyAdvice"></bean>
        
        <!-- 3、开启使用注解完成织入 -->
        <aop:aspectj-autoproxy>
        
        </aop:aspectj-autoproxy>
    </beans>

    4)测试demo

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:/cn/itcast/annotationaop/applicationContext.xml")  //指定spring的配置文件
    public class test1 {
        
        //将容器中的 userService 注入到test中
        @Resource(name="userService")
        private UserService us;
        
        
        @org.junit.Test
        public void test1(){
            us.save();
        }
        
    }

    clipboard

  • 相关阅读:
    剑指offer 31.时间效率 整数中1出现的次数(从1到n整数中1出现的次数)
    剑指offer 30.时间效率 连续子数组的最大和
    ElasticSearch 数据路由原理+增删改查内部原理+写一致性原理以及quorum机制
    剑指offer 29.时间效率 最小的K个数
    剑指offer 28.时间效率 数组中出现次数超过一半的数字
    剑指offer 27.分解让复杂问题简单 字符串的排列
    ElasticSearch 并发冲突+悲观锁与乐观锁+基于_version和external version进行乐观锁并发控制
    剑指offer 26.分解让复杂问题简单 二叉搜索树与双向链表
    Spfa+DP【p2149】[SDOI2009]Elaxia的路线
    Dfs【bzoj3252】攻略
  • 原文地址:https://www.cnblogs.com/houchen/p/13196392.html
Copyright © 2020-2023  润新知