zoukankan      html  css  js  c++  java
  • 使用注解配置Spring框架自动代理通知

    话不多说上代码

    项目架构图及Lib包如下:

    第二步创建业务类接口

    package cn.happy.day01.entity;
    /**
     * 1.业务接口
     * @author Happy
     *
     */
    public interface ISomeService {
        //1.1  执行事务
       public void doTransaction();
        //1.2 书写日志
       public String doLog();
    }

    第三步实现接口重写接口方法

    package cn.happy.day01.entity;
    
    public class SomeServiceImpl implements ISomeService {
    
        @Override
        public void doTransaction() {
            System.out.println("开启事务");
        }
    
        @Override
        public String doLog() {
            System.out.println("书写日志");
            return "abc";
        }
    
    }

    第四步创建aop包定义增强类

    package cn.happy.day01.aop;
    
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    
    
    @Aspect  //该类为切面   
    public class MyAspect {
        //前置通知
        @Before(value="execution(public * *(..))")
        public void myBefore(){
            System.out.println("这是前置增强");
        }
      
    }

    第五步在applicationContext.xml中配置:

    <?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: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">
       
       <!-- 目标对象 -->
       <bean id="someService" class="cn.happy.day01.entity.SomeServiceImpl"></bean>
    
       <!-- 切面: -->
       <bean id="myAspect" class="cn.happy.day01.aop.MyAspect"></bean>
       
      <aop:aspectj-autoproxy/>
    </beans>

    最后我们写测试类测试

    package cn.happy.day01.test;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import cn.happy.day01.entity.ISomeService;
    public class Spring_01Test {
        @Test
        public void testOne(){
            
            ApplicationContext ctx=new ClassPathXmlApplicationContext("cn/happy/day01/applicationContext.xml");
            ISomeService service = (ISomeService)ctx.getBean("someService");
            service.doTransaction();
            String result = service.doLog();
            System.out.println(result);
        }
    }

    ps:


    1.切入点表达式
    execution(【modifiers-pattern?】 访问修饰符
    ret-type-pattern 返回值类型
    【declaring-type-pattern?】 全限定性类名
    name-pattern(param-pattern) 方法名(参数名)
    【throws-pattern?】) 抛出异常类型

    切入点表达式要匹配的对象就是目标方法的方法名。所以,execution表达式中明显就是方法的签名。注意:表达式中加[]的部分表示可省略部分,各部分间用空格分开。在其中可以使用以下符号:
    符号 意义
    * 0至多个任意字符
    .. 用在方法参数中,表示任意多个参数
    用在包名后,表示当前包及其子包路径
    + 用在类名后,表示当前类及其子类
    用在接口后,表示当前接口及其实现类
    案例:
    execution(public * *(..)) 指定切入点为:任意公共方法
    execution(* set*(..)) 指定切入点为:任何一个以"set"开始的方法

    ok就这样了试试吧

  • 相关阅读:
    [NOIP 2012] 疫情控制
    [HDU 6315] Naive Operations
    [BZOJ 3363] Cow Marathon
    单片机的模块化编程
    QT中定时器的使用方法
    47: error: undefined reference to `QWebView::QWebView(QWidget*)'
    如何分析一个QT类
    个人收集的一些库、工具、技术介绍
    点阵字体显示系列之二:汉字显示
    点阵字体显示系列之一:ASCII码字库的显示
  • 原文地址:https://www.cnblogs.com/System-out-println/p/5949618.html
Copyright © 2011-2022 走看看