桂林网站设计公司wordpress term_group
桂林网站设计公司,wordpress term_group,公司企业信息查询,网络优化排名培训本文介绍通过XML方式实现Spring AOP#xff0c;在上一篇中已经介绍了通过注解#xff0b;java配置的方式#xff0c;这篇文章主要是看XML中怎么配置#xff0c;直接上代码了#xff1a; 一、创建一个连接点 1⃣️定义接口 注意⚠️#xff1a;可以定义接口#xff0c;也…本文介绍通过XML方式实现Spring AOP在上一篇中已经介绍了通过注解java配置的方式这篇文章主要是看XML中怎么配置直接上代码了 一、创建一个连接点 1⃣️定义接口 注意⚠️可以定义接口也可以不定义定义接口时使用jdk动态代理不定义接口时使用cglib动态代理 1 //定义一个接口
2 public interface CoderProjectService {
3 public void getProjectInfo(CoderProject coderProject);
4 } 2⃣️接口实现类 1 //创建一个类来处理业务逻辑作为要织入切面中的被代理对象2 public class CoderProjectServiceImpl implements CoderProjectService {3 4 Override5 public void getProjectInfo(CoderProject coderProject) {6 System.out.println(项目名称 coderProject.getProjectName() 项目版本号: coderProject.getProjectVersion()7 项目描述 coderProject.getProjectDesc());8 }9
10 } 因为我要配置引入功能所以顺便定义要引入的接口及实现类 3⃣️创建引入接口 1 /*
2 * 定义一个新接口用来做一些验证
3 */
4 public interface CheckExist {
5 public boolean checkIsEmpty(CoderProject project);
6 } 4⃣️引入接口实现类 1 /*2 * 定义一个类增加一些验证逻辑对被代理对象逻辑进行增强或完善3 */4 public class CheckExistImp implements CheckExist {5 6 Override7 public boolean checkIsEmpty(CoderProject project) {8 return project ! null;9 }
10
11 } 二、创建一个切面 1 /*2 * 定义一个切面没有任何注解需要在XML中进行配置3 */4 public class XmlAspect {5 6 // 引入增强类7 public CheckExistImp checkExistImp;8 9 public void before(CoderProject pro) {
10 System.out.println(项目名称 pro.getProjectName() before...);
11 }
12
13 public void around(ProceedingJoinPoint pjp) {
14 System.out.println(around before...);
15 try {
16 pjp.proceed();
17 } catch (Throwable e) {
18 e.printStackTrace();
19 }
20 System.out.println(around after...);
21 }
22
23 public void after() {
24 System.out.println(after...);
25 }
26
27 public void afterThrowing() {
28 System.out.println(afterThrowing...);
29 }
30
31 public void afterReturning() {
32 System.out.println(afterReturning...);
33 }
34 } 这个切面就是一个简单的类不过提供了四种通知的方法并且前置通知含有参数同时也将引入类作为属性添加进来之前的所有注解都会在XML文件中配置。 三、配置spring-aop-xml.xml配置文件 1 ?xml version1.0 encodingUTF-8?2 beans xmlnshttp://www.springframework.org/schema/beans3 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:aophttp://www.springframework.org/schema/aop4 xsi:schemaLocationhttp://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-beans.xsd 6 http://www.springframework.org/schema/aop 7 http://www.springframework.org/schema/aop/spring-aop.xsd8 !--定义切面bean --9 bean idxmlAspect classcom.hyc.aop.xml.XmlAspect/bean
10 !-- 定义被代理对象bean --
11 bean idcoderProjectService classcom.hyc.aop.xml.CoderProjectServiceImpl/bean
12 !-- 定义切面的配置注解 --
13 aop:config
14 aop:aspect refxmlAspect
15 !--定义一个切点 --
16 aop:pointcut idgetProjectInfo expressionexecution(* com.hyc.aop.xml.CoderProjectServiceImpl.getProjectInfo(..)) /
17 !-- 定义四类通知--
18 aop:before methodbefore pointcutexecution(* com.hyc.aop.xml.CoderProjectServiceImpl.getProjectInfo(..)) and args(pro))/
19 aop:after methodafter pointcut-refgetProjectInfo/
20 aop:after-returning methodafterReturning pointcut-refgetProjectInfo/
21 aop:after-throwing methodafterThrowing pointcut-refgetProjectInfo/
22 !-- 定义环绕通知 --
23 aop:around methodaround pointcut-refgetProjectInfo/
24 !--定义增强类 --
25 aop:declare-parents types-matchingcom.hyc.aop.xml.CoderProjectServiceImpl implement-interfacecom.hyc.aop.xml.CheckExist default-implcom.hyc.aop.xml.CheckExistImp/
26 /aop:aspect
27 /aop:config
28
29 !-- 定义一个project bean用来传给接入点方法 --
30 bean idproject classcom.hyc.pojo.CoderProject
31 property nameid value1 /
32 property nameprojectName value云管理平台 /
33 property nameprojectVersion valueV1.0 /
34 property nameprojectDesc value云存储管理平台 /
35 /bean
36 /beans 注意⚠️在使用aop配置之前要先引入相关的命名空间如上面代码中的红色加粗部分。 其他的配置及含义都在注释中有接受不再赘述 四、创建测试方法 1 Test2 public void testAopByXml() {3 // 动态生成切面4 ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext(classpath*:spring-aop-xml.xml);5 // 获取被代理对象6 CoderProjectService coderProjectService (CoderProjectService) context.getBean(coderProjectService);7 // 获取项目类参数8 CoderProject project (CoderProject) context.getBean(project);9 // 获取增强类将被代理对象强制转化成增强类
10 CheckExist cd (CheckExist) coderProjectService;
11 if (cd.checkIsEmpty(project)) {
12 coderProjectService.getProjectInfo(project);
13 } else {
14 System.out.println(被代理对象不能为空);
15 }
16 } 测试结果如下 1 项目名称 云管理平台before...
2 around before...
3 项目名称云管理平台项目版本号:V1.0项目描述云存储管理平台
4 around after...
5 afterReturning...
6 after... 可以看到按照Sprinf AOP规定的流程执行了方法但是就如在上一篇文章中提到的使用XML方式时around的before方法会在before方法之后执行。 其实从实现过程就能看出来注解方式比XML要简单因为XML要配置很多东西而且容易出错所以一般来说以注解为主XML为辅。转载于:https://www.cnblogs.com/hellowhy/p/9721258.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/90304.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!