码迷,mamicode.com
首页 > 编程语言 > 详细

javaEE之-------Spring中的aspectJ的应用

时间:2016-01-19 10:49:36      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

   采用aspectJ可以且整个项目里面的需求。

如数据库的事物处理等

演示实例为主:

和之前一样,先采用java手动写的方式。。

切面技术 = 通知 + 切点

	<span style="font-size:18px;">@Test
	public void test1(){
		//1,获得代理工厂
		ProxyFactory factory = new ProxyFactory(new Person());
		//2,切点
		AspectJExpressionPointcut cut = new AspectJExpressionPointcut();

		//以下主要是讲aspectj的切点语法,如果把<bean>配置在xml中且使用自动代理,那么所有的bean都会按下面的匹配原则被切
		//cut.setExpression("execution( void cn.hncu.aop.Person.run() )");//指定拦:Person类中的空参 run()方法
		//cut.setExpression("execution( * cn.hncu.aop.Person.*n() )");//拦:方法名以“n”结尾且空参的方法
		//cut.setExpression("execution( void cn.hncu.aop.Person.*() )");//拦:返回值为void且空参的方法
		//cut.setExpression("execution( * cn.hncu.aop.Person.*(*) )");//拦:参数个数为1个的方法
		//cut.setExpression("execution( * cn.hncu.aop.Person.*(*,*) )");//拦:参数个数为2个的方法
		//cut.setExpression("execution( * cn.hncu.aop.Person.*(*,..) )");//拦:参数个数>=1个的方法
		//cut.setExpression("execution( * cn.hncu.aop.Person.*(..) )");//拦:参数任意,返回类型任意
		//cut.setExpression("execution( * cn.hncu.aop.Person.*(String,..) )");//拦:第一个参数必须是String型,其它参数任意。返回类型任意
//		cut.setExpression("execution( * cn.hncu..*(..) )");//“cn.hncu..”中的“..”指的是cn.hncu下的任意目录(无论有多深)
		cut.setExpression("execution( * cn.aop..*(..))");
		
		//通知
		Advice advice =new MethodInterceptor() {
			
			@Override
			public Object invoke(MethodInvocation inv) throws Throwable {
				System.out.println("采用aspectj方法之前拦截");
				Object obj=inv.proceed();
				System.out.println("之后拦截");
				return obj;
			}
		};
		Advisor advisor =new DefaultPointcutAdvisor(cut, advice);
		factory.addAdvisor(advisor);
		Person p =(Person) factory.getProxy();
		p.run();
		p.say();
	}</span>
里面含有部分正则表达式。。

然后采用配置文件的方式(这里只是简单的测试)

	<bean id="person" class="cn.aop.Person"></bean>
	<bean id="stud" class="cn.aop.Student"></bean>
	
    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean>
	
	<bean id="advisor" class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor">
	  
	   <property name="expression" value="execution( * cn.aop.Person.*(..) )" />
	   <property name="advice" >
			<bean   class="cn.aop.demo1.Around" />
	   </property>
	</bean>

从之前我们可以看到修改了下切面的包

<bean id="advisor" class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor">

具体要拦截什么,主要配置

<property name="expression" value="execution( * cn.aop.Person.*(..) )" /> 

接口的实现类(简单的测试)

package cn.aop.demo1;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class Around implements MethodInterceptor {

	@Override
	public Object invoke(MethodInvocation method) throws Throwable {
		System.out.println("开始拦截了");
		Object obj= method.proceed();
		System.out.println("拦截返回啦");
		return obj;
	}
}


测试类:

	@Test
	public void test(){
		ApplicationContext ctx =new ClassPathXmlApplicationContext("cn/aop/aspectj/aspectj.xml");
		Person p=ctx.getBean(Person.class);
		p.run();
		p.say();
	}


javaEE之-------Spring中的aspectJ的应用

标签:

原文地址:http://blog.csdn.net/yangxin_blog/article/details/50533352

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!