您的位置:首页 > 编程语言 > Java开发

使用注解配置Spring框架自动代理通知

2016-10-11 15:53 357 查看
话不多说上代码

项目架构图及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就这样了试试吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: