话不多说上代码

项目架构图及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就这样了试试吧