Spring学习_03_AOP在Spring中的两种实现方式
来源:互联网 发布:对网络教育的看法英语 编辑:程序博客网 时间:2024/05/22 00:11
在Spring中有两种方式实现AOP,一种方式是Annotation,另外一种方式就是XML的方式。在Spring中,本身有自己的一套实现动态代理的机制(AOP的核心就是动态代理),但是其自己本身的机制在开发中一般很少使用,使用的最多的就是使用AspectJ框架。(AspectJ是专门用来实现动态代理的框架)。
Annotation方式通过以下基本来实现:
第一步:在项目的classpath中加入AspecJ的相关JAR包,包括aspectjweaver.jar 和aspectrt.jar(经过自己测试,还需要加入aopalliance.jar和cglib的相关包)。这是在spring中使用aspectj的核心jar包。
第二步:配置spring的配置文件,首先在XML文件中加入AOP的命名空间等信息。然后加入<aop:aspectj-autoproxy/>,这个表示可以使用aspectj注解的方法来使用spring的AOP,它会扫描包中的类,若一个类需要代理,则为其产生一个代理。代码如下:
<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-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"><context:annotation-config/><context:component-scan base-package="com.zxb"/><!-- 以下代码表面会使用aspectj注解的方式来使用spring中的aop --><aop:aspectj-autoproxy/></beans>
第三步:编写我们要插入切面逻辑的切入点:
@Component("userDao")public class UserDAOImpl implements UserDAO {public void save(User user) {System.out.println("user saved!");}}
第四步:实现自己的切面类,也就是加来要插入到切入点的切面逻辑。代码如下:
@Component@Aspectpublic class myAspect{@Before(value = "execution(public * com.zxb.service..*.add(..))")public void Before(){System.out.println("...Started!...");}}第五步:编写测试:
@Component("userDao")public class UserDAOImpl implements UserDAO {public void save(User user) {System.out.println("user saved!");}}第六步:查看结果:
...Started!...user saved!
注意:1:aopalliance.jar 、cglib相关jar包也需要加入。否则在运行的时候spring会提示找不到MethodIntercepter类和缺失cglib相关类的错误。
2:要插入切面逻辑的切入点所属的对象一定要是由spring来管理的,而不是自己new出来的。包括切面逻辑也必须由spring的容器来管理。
XML方式通过以下基本来实现:
这种方法和上面的Annotation的方式没有大的区别,首先上面的类(不是XML文件)只需要把切面类中的@Aspect 、@Before的注解去掉即可。其他都不用改变。唯一需要变化的就是XML文件。其XML文件的代码如下所示:
<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-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"><context:annotation-config/><context:component-scan base-package="com.zxb"/><!-- 以下代码表面会使用aspectj注解的方式来使用spring中的aop <aop:aspectj-autoproxy/>--><bean id="myAspect" class="com.zxb.proxy.myAspect"></bean><aop:config><aop:aspect id="logAspect" ref="myAspect"><aop:before method="Before" pointcut="execution(public * com.zxb.service..*.add(..))"/></aop:aspect></aop:config></beans>运行结果和上面一样。没有任何变化。
有一个很有意思的问题必须要记录一下:关于AOP,Annotation 和 XML到底谁更合适?答案:对于IOC而言,Annotation方式更加合适和重要,而对于AOP而言正好相反。因为实际开发中,我们所使用的切面逻辑是有第三方公司提供的,是无法得到源码的是,如果是使用Annotation方式的话,是没有办法的。而如果是用xml的话,我们就可以很方便的来进行配置。
最后,总结一下AOP中的一些概念。
1:JoinPoint :连接点,加入切面逻辑的点。所对应的语法就是连接点语法。(比如上面的“execution(public * com.zxb.service..*.add(..))”)。
2:PointCut:切入点的集合:
3:Aspect:切面,切面类上加入的逻辑就是切面。
4:Advice:建议,有点类似于切面类的逻辑,比如上面的@Before表示建议上一个方法的执行之前加入什么样的逻辑。
5:Target:被代理的对象。被加入了切面的类,比如上面的service的类就是我们这里的目标。
6:weave:织入,我们上面目标service实现类的目标方法add之前织入了我们的切面逻辑Before方法中的逻辑。
最后附上一片不错的文章:Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)
- Spring学习_03_AOP在Spring中的两种实现方式
- Spring定时器的两种实现方式
- Spring定时器的两种实现方式
- Spring定时器的两种实现方式
- spring定时器的两种实现方式
- Spring定时器的两种实现方式
- Spring定时器的两种实现方式
- Spring定时器的两种实现方式
- Spring定时器的两种实现方式
- spring 定时器两种实现方式
- Spring定时器的两种实现方式
- Spring定时器的两种实现方式
- Spring定时器的两种实现方式
- Spring定时器的两种实现方式
- Spring定时器的两种实现方式
- Spring AOP的两种实现方式
- Spring定时器的两种实现方式
- Spring定时器的两种实现方式
- set遍历
- (算法设计技巧与分析)floyd
- php 函数
- MSSQL数据库导入导出时错误 0xc0202049: 数据流任务 1: 无法在只读列“ID”中插入数据
- CserialPort类函数解析及基本操作流程 基于C++
- Spring学习_03_AOP在Spring中的两种实现方式
- 寒假集训——Index of super-prime 和 北航9届校赛晴天小猪爱61
- Oracle EBS:PO 常用的查询及Tips
- 数据存储大小端
- 黑马程序员——枚举中自有函数的调用
- 20150310总结
- (算法设计技巧与分析)Knapsack
- Castle学习系列
- IOS 自定义控件之-显示下载过程的ImageView