通过前面的学习,读者对Spring中的两种代理模式已经有了一定的了解。实际上,Spring中的AOP代理默认就是使用JDK动态代理的方式来实现的。在Spring中,使用Proxy FactoryBean是创建AOP代理的最基本方式。接下来,将对Spring中基于代理类的AOP实现的相关知识进行详细讲解。
Spring的通知类型
在讲解具体的代理类之前,我们需要先了解一下Spring的通知类型。Spring中的通知按照在目标类方法的连接点位置,可以分为以下5种类型。
· org.aopalliance.intercept.MethodInterceptor(环绕通知)
在目标方法执行前后实施增强,可以应用于日志、事务管理等功能。
· org.springframework.aop.MethodBeforeAdvice(前置通知)
在目标方法执行前实施增强,可以应用于权限管理等功能。
· org.springframework.aop.AfterReturningAdvice(后置通知)
在目标方法执行后实施增强,可以应用于关闭流、上传文件、删除临时文件等功能。
· org.springframework.aop.ThrowsAdvice(异常通知)
在方法抛出异常后实施增强,可以应用于处理异常记录日志等功能。
· org.springframework.aop.IntroductionInterceptor(引介通知)
在目标类中添加一些新的方法和属性,可以应用于修改老版本程序(增强类)。
ProxyFactoryBean
ProxyFactoryBean是FactoryBean接口的实现类,FactoryBean负责实例化一个Bean,而ProxyFactoryBean负责为其他Bean创建代理实例。在Spring中,使用ProxyFactoryBean是创建AOP代理的基本方式。
ProxyFactoryBean类中的常用可配置属性如表3-1所示。
对ProxyFactoryBean类有了初步的了解后,接下来通过一个典型的环绕通知案例,来演示Spring使用ProxyFactoryBean创建AOP代理的过程,具体步骤如下。
(1)在核心JAR包的基础上,再向chapter03项目的lib目录中导入AOP的JAR包spring-aop-4.3.6.RELEASE.jar和aopalliance-1.0.jar,如图3-5所示。
关于这两个JAR包的介绍如下。
· spring-aop-4.3.6.RELEASE.jar:是Spring为AOP提供的实现包,Spring的包中已经提供。
· aopalliance-1.0.jar:是AOP联盟提供的规范包,该JAR包可以通过地址“http://mvnrepository.com/artifact/aopalliance/aopalliance/1.0”下载。
(2)在src目录下,创建一个com.itheima.factorybean包,在该包中创建切面类MyAspect。由于实现环绕通知需要实现org.aopalliance.intercept. MethodInterceptor接口,所以MyAspect类需要实现该接口,并实现接口中的invoke()方法,来执行目标方法,如文件3-9所示。
这里为了演示效果,在目标方法前后分别执行了检查权限和记录日志的方法,这两个方法也就是增强的方法,也就是通知。
(3)在com.itheima.factorybean包中,创建配置文件applicationContext.xml,并指定代理对象,如文件3-10所示。
在文件3-10中,首先通过元素定义了目标类和切面,然后使用ProxyFactoryBean类定义了代理对象。在定义的代理对象中,分别通过子元素指定了代理实现的接口、代理的目标对象、需要织入目标类的通知以及代理方式。
(4)在com.itheima.factorybean包中,创建测试类ProxyFactoryBeanTest,在类中通过Spring容器获取代理对象的实例,并执行目标方法,如文件3-11所示。
执行程序后,控制台的输出结果如图3-6所示。