javaEE之------ApectJ的切面技术===标签

现在比较流行了aop技术之一========标签

实现步骤:

一,导入aop标签

方法,打开aop包,里面就有。

这个里面就有


然后根据选择spring的版本。在配置文件中配置

如下:

<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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

这样就导入了aop标签


二,配置切点和通知

<aop:config>
		<aop:aspect ref="myadvior"><!-- 需要导入作为切面的类-->
			<aop:pointcut expression="execution(* cn..Person.*(..))" id="cut"/>
			<aop:before method="test1" pointcut-ref="cut"/> <!-- 这是通知,拦截切点位置,也就是拦截时  需要做的事情 -->
			<aop:aftermethod="test1" pointcut-ref="cut"/> <!-- 拦截核心之后执行的动作,全部写在test1方法里面了 -->
			<!-- <aop:before method="test1" pointcut="execution(* cn..Person.*(..))"/> 这样也是可以的,就不用切点了,直接写在这里面 -->
		</aop:aspect>
	</aop:config>	
里面的配置通知类型很多

三,被代理类以及自动注解类

<span style="font-size:18px;"><!-- 需要的三元素 (被代理类, 自动代理类,切面)采用标签,切面和之前的有点不同,只是一个简单的pojo导入 -->
	<bean id="person" class="cn.aop.aspectj3.Person"></bean></span>
<span style="font-size:18px;"> <!-- 注解自动标签,自动去查找带有注解的类和方法 -->
<span style="white-space:pre">	</span> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</span>

,导入我们作为切面的类

<bean class="cn.aop.aspectj3.MyAdvisor" id="myadvior"/><!--当做切面的pojo 注入 -->

配置文件已经完成。


五,被导入的作为切面的类

public class MyAdvisor {

		public void test1(){
			System.out.println("这是test...");
		}
}
很普通的一类,方法名在配置切面里面,通知的时间也完成了。。这里就可以实现想要完成的动作了。

标签相当于之前的,有很大的优化,如在核心模块完全不知道是都做了拦截,进一步实现了解耦。

=========================这里已经介绍完====================



源代码以及测试

1,配置文件

<?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:tx="http://www.springframework.org/schema/tx"
		xmlns:aop="http://www.springframework.org/schema/aop"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
				http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
	
	<!-- 需要的三元素 (被代理类, 自动代理类,切面)采用标签,切面和之前的有点不同,只是一个简单的pojo导入 -->
	<bean id="person" class="cn.aop.aspectj3.Person"></bean>
	
	<!-- 自动代理注解
	<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"></bean>
	 -->
	 <!-- 注解自动标签,自动去查找带有注解的类和方法 -->
	 <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
	 
	 
	<aop:config>
		<aop:aspect ref="myadvior">
			<aop:pointcut expression="execution(* cn..Person.*(..))" id="cut"/>
			<aop:before method="test1" pointcut-ref="cut"/> <!-- 这是通知,拦截切点位置,也就是拦截时  需要做的事情 -->
			<aop:aftermethod="test1" pointcut-ref="cut"/> <!-- 拦截核心之后执行的动作,全部写在test1方法里面了 -->
			<!-- <aop:before method="test1" pointcut="execution(* cn..Person.*(..))"/> 这样也是可以的,就不用切点了,直接写在这里面 -->
		</aop:aspect>
	</aop:config>	
	
	<bean class="cn.aop.aspectj3.MyAdvisor" id="myadvior"/><!--当做切面的pojo 注入 -->
</beans>

     2,  作为切面的类

package cn.aop.aspectj3;

public class MyAdvisor {

		public void test1(){
			System.out.println("这是test...");
		}
}
3,被代理的对象

package cn.aop.aspectj3;

public class Person {

	public void say(){
		System.out.println("...这是say..");
	}
	
	public void run(){
		System.out.println("这是person中的 run方法");
	}
	
}
4,测试

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




发布了107 篇原创文章 · 获赞 30 · 访问量 33万+

猜你喜欢

转载自blog.csdn.net/yangxin_blog/article/details/50548295