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)




1 0
原创粉丝点击