Spring AOP前置通知实例说明AOP相关概念
2018-12-27 07:42:21来源:博客园 阅读 ()
今天又看了下韩顺平的SpringAOP的讲解,讲解的很透彻。仿照视频自己使用下前置通知。
一、引出问题
有个接口TestServiceInter,有两个实现方法TestService和Test2Service。他们都有sayHello();我们的需求是在调用这两个方法之前,要先完成写日志的功能;
二、菜鸟的想法
我在各个实现类的sayHello()方法里面写上写日志的功能就是了。
这样实现存在的问题:代码冗余。当所有实现类都要加上日志功能的时候,需要写很多重复代码
三、利用AOP前置通知实现此功能
3.1 第一步:我们需要定义一个接口
package com.jdc.aop; /** * @author DEllComputer * @Title: TestService * @ProjectName SpringAop * @Description: * @date 2018/12/251:38 PM */ public interface TestService { /** * @Description: * @param ${tags} * @return ${return_type} * @throws * @author jdc * @date 2018/12/25 1:39 PM */ void sayHi(String name); }
3.2 第二步:实现接口
public class TestServiceImpl implements TestService { private String name; /** * @Description: say hi * @param ${tags} * @return ${return_type} * @throws * @author jdc * @date 2018/12/25 1:40 PM */ @Override public void sayHi(String name ) { System.out.println("hi:" + name); } public String getName() { return name; } public void setName(String name) { this.name = name; } }
3.3 第三步:实现前置通知(AOP中通知的概念就是实现增强代码逻辑的,比如这里的记录日志)
/** * @author DEllComputer * @Title: MyBeforeAdvice * @ProjectName SpringAop * @Description: 写日志前置通知 * @date 2018/12/251:42 PM */ public class MyBeforeAdvice implements MethodBeforeAdvice { /** * @Description: 写日志的功能 * @param ${tags} * @return ${return_type} * @throws * @author jdc * @date 2018/12/25 1:44 PM */ @Override public void before(Method method, Object[] objects, Object o) throws Throwable { System.out.println("我是写日志的功能。"); } }
前置通知需要实现MethodBeforeAdvice接口,前置通知是在目标方法调用之前调用;
3.4 第四步:在Spring的配置文件中配置代理对象,通知,目标对象
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 配置前置通知 --> <bean id="myBeforeAdvice" class="com.jdc.aop.advice.MyBeforeAdvice"/> <!-- 配置被代理对象 --> <bean id="logTestServiceImpl" class="com.jdc.aop.TestServiceImpl"> <property name="name" value="Test"></property> </bean> <!-- 配置代理对象 --> <bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean"> <!-- 代理接口集 配置哪些接口要被代理 --> <property name="proxyInterfaces"> <list> <value>com.jdc.aop.TestService</value> </list> </property> <!-- 把通知织入代理对象 --> <property name="interceptorNames"> <value>myBeforeAdvice</value> </property> <!-- 配置被代理的对象 --> <property name="target" ref="logTestServiceImpl"/> </bean> </beans>
ProxyFactoryBean是一个代理对象,如果我们被代理的对象实现了接口,Spring使用的是jdk动态代理技术实现的动态代理;所以我们要告诉代理对象,我们的哪些接口需要被代理,然后哪个对象需要被代理,我的增强实现应该怎么被织入到代理对象(前置,后置,环绕....)
3.5 第五步:写测试代码测试
public class TestMain { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml"); //获取代理对象 TestService log = (TestService) ac.getBean("proxyFactoryBean"); log.sayHi("哈哈"); } }
注意这里,我们需要获取代理对象,而不是目标对象,不然不能调用前置通知的代码。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:一次同步方法的失败与原因总结
- Spring系列.ApplicationContext接口 2020-06-11
- springboot2配置JavaMelody与springMVC配置JavaMelody 2020-06-11
- 给你一份超详细 Spring Boot 知识清单 2020-06-11
- SpringBoot 2.3 整合最新版 ShardingJdbc + Druid + MyBatis 2020-06-11
- 掌握SpringBoot-2.3的容器探针:实战篇 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash