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

采用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();
	}
时间: 2024-10-22 18:59:11

javaEE之-------Spring中的aspectJ的应用的相关文章

在Spring中使用AspectJ实现AOP

在Spring中,最常用的AOP框架是AspectJ,使用AspectJ实现AOP有2种方式: 基于XML的声明式AspectJ 基于注解的声明式AspectJ 基于XML的声明式AspectJ 1.在项目中添加包spring-aspects.jar(spring自带).aspectjweaver.jar(需要自己下载添加). 2.新建包user,包下新建类User 1 public class User{ 2 public void addUser(){ 3 System.out.printl

Spring AOP——Spring 中面向切面编程

前面两篇文章记录了 Spring IOC 的相关知识,本文记录 Spring 中的另一特性 AOP 相关知识. 部分参考资料: <Spring实战(第4版)> <轻量级 JavaEE 企业应用实战(第四版)> Spring 官方文档 W3CSchool Spring教程 易百教程 Spring教程 一.AOP--另一种编程思想 1.1 什么是 AOP AOP (Aspect Orient Programming),直译过来就是 面向切面编程.AOP 是一种编程思想,是面向对象编程(

Spring学习--用 ASpectJ 注解实现 AOP

用 AspectJ 注解声明切面: 要在 Spring 中声明 AspectJ 切面 , 只需要在 IOC 容器中将切面声明为 bean 实例.当在 Spring IOC 容器中初始化 AsjectJ 切面之后 , Spring IOC 容器就会为那些与 AspectJ 切面相匹配的 bean 创建代理. 在 ApectJ 注解中 , 切面只是一个带有 @Asject 注解的 Java 类. 通知是标注有某种注解的简单的 Java 方法. AspectJ 支持 5 种类型的通知注解: @Befo

Spring AOP和AspectJ支持

学了Spring之后发现我都不知道java为何物-- 在这一章中有好几节,讲的切面编程 第一节:在项目中启用Spring的AspectJ注解支持 第二节:用AspectJ注解声明aspect 第三节:访问连接点信息 第四节:指定aspect的优先级 第五节:重用切入点定义 第六节:编写AspectJ切入点表达式 第七节:在Bean中引入行为 第八节:为Bean引入状态 第九节:用基于XML的配置声明aspect 如果JVM版本低于1.4时后者不想依赖于AspectJ,就不应该使用AspectJ来

关于spring中AOP的几件小事

0.AOP简介 AOP(Aspect-Oriented Programming,面向切面编程):是一种新的方法论,是穿透OOP的补充. AOP的主要编程对象是切面(aspect),而切面模块化横切关注点. 在使用AOP编程时,仍然需要定义功能功能,但可以明确的定义这个功能在哪里,以什么方式应用,并且不必修改受影响的类.这样一来横切关注点就被模块化到特殊的对象(切面)里. AOP的好处: - 每个事物逻辑位于同一层,代码不分散,便于维护和升级. - 业务模块更简洁,只包含核心业务代码. 1.AOP

JavaEE开发之Spring中的条件注解、组合注解与元注解

上篇博客我们详细的聊了<JavaEE开发之Spring中的多线程编程以及任务定时器详解>,本篇博客我们就来聊聊条件注解@Conditional以及组合条件.条件注解说简单点就是根据特定的条件来选择Bean对象的创建.条件注解就是可以根据不同的条件来做出不同的事情.在Spring中条件注解可以说是设计模式中状态模式的一种体现方式,同时也是面向对象编程中多态的应用部分.而组合注解就是将现有的注解进行组合.下方会给出具体的介绍和实例. 一.条件注解[email protected] 本篇博客的本部分

JavaEE开发之Spring中的依赖注入与AOP编程

一.快速创建Mava管理的Spring工程 因为本篇博客是讨论关于Spring的东西,所以我们就不创建WebApp的工程了.我们使用Spring来快速的创建一个Maven管理的工程.如下所示找到File->New->Maven Project选项来创建一个新的Maven Project,具体如下所示: 下方我们选择创建一个简单的Maven工程,跳过模板的选择.上篇博客我们在创建Maven工程时,是没有选择下方这个选项的,然后我们选择了一个WebApp的模板.而本篇博客,我们不需要WebApp的

Spring中AspectJ的实现AOP(XML+注解)

AOP相关术语如下: 1. Joinpoint(连接点) -- 所谓连接点是指那些被拦截到的点.在spring中,这些点指的是方法,因为spring只支持方法类型的连接点 2. Pointcut(切入点) -- 所谓切入点是指我们要对哪些Joinpoint进行拦截的定义 3. Advice(通知/增强) -- 所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能) 4. Introduction(引介) -- 引

Spring中@Resource、@controller注解的含义

@Resource 注解被用来激活一个命名资源(named resource)的依赖注入,在JavaEE应用程序中,该注解被典型地转换为绑定于JNDI context中的一个对象. Spring确实支持使用@Resource通过JNDI lookup来解析对象,默认地,拥有与@Resource注解所提供名字相匹配的"bean name(bean名字)"的Spring管理对象会被注入. 在下面的例子中,Spring会向加了注解的setter方法传递bean名为"dataSour