Spring AOP前置通知实例说明AOP相关概念
今天又看了下韩顺平的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("哈哈"); }
}
注意这里,我们需要获取代理对象,而不是目标对象,不然不能调用前置通知的代码。
Spring AOP前置通知实例说明AOP相关概念的更多相关文章
- Spring AOP前置通知实例讲解与AOP详细解析
一.引出问题 有个接口TestServiceInter,有两个实现方法TestService和Test2Service.他们都有sayHello():我们的需求是在调用这两个方法之前,要先完成写日志的 ...
- Spring AOP前置通知和后置通知
Spring AOP AspectJ:Java社区里最完整最流行的AOP框架 在Spring2.0以上的版本中,可以使用基于AspectJ注解或基于XML配置的AOP 在Spring中启用Aspect ...
- Spring AOP 前置通知
我们使用AspectJ对Spring进行AOP操作,有两种方式,注解和XML配置方式,先在pom.xml中声明jar包 <dependencies> <dependency> ...
- Spring初学之annotation实现AOP前置通知和后置通知
实现两个整数的加减乘除,并在每个计算前后打印出日志. ArithmeticCalculator.java: package spring.aop.impl; public interface Arit ...
- Spring初学之xml实现AOP前置通知、后置通知、返回通知、异常通知等
实现两个整数的加减乘除,在每个方法执行前后打印日志. ArithmeticCalculator.java: package spring.aop.impl.xml; public interface ...
- Spring初学之annotation实现AOP前置通知、后置通知、返回通知、异常通知。
实现两个整数的加减乘除.在执行每个方法之前打印日志. ArithmeticCalculator.java: package spring.aop.impl; public interface Arit ...
- 利用Spring AOP的通知类型以及创建通知
写在最前端 1.SpringAOP中共有六种通知类型,只要我们自定义一个类实现对应的接口,它们全都是org.springframework.aop包中的. 2.AOP的连接点可以是方法调用.方法调用本 ...
- Spring详解(五)------AOP
这章我们接着讲 Spring 的核心概念---AOP,这也是 Spring 框架中最为核心的一个概念. PS:本篇博客源码下载链接:http://pan.baidu.com/s/1skZjg7r 密码 ...
- Spring学习4-面向切面(AOP)之aspectj注解方式
一.简介 1.AOP用在哪些方面:AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理.日志管理.权限控制,异常处理等,封装起来,便于减少系统的重复代码,降低模块间的耦合 ...
随机推荐
- Oracle游标的使用示例
此文是使用Oracle游标的几种方式,for...in会自动打开游标,fetch...into需要手动打开游标,游标类似于一个只会往前移动的指针,每次指向数据集中的一行数据,通过游标可以打开数据集,也 ...
- [MySQL] 5.7版本以上group by语句报1055错误问题
1. 在5.7版本以上mysql中使用group by语句进行分组时, 如果select的字段 , 不是完全对应的group by后面的字段 , 有其他字段 , 那么就会报这个错误 ERROR 105 ...
- [android]android下apk的安装过程
/********************2016年4月23日更新********************************/ 知乎:有什么apk分析工具? 拿到了一个apk文件,怀疑不安全,在 ...
- Java开发笔记(二十二)神奇的冒号
Java中的标点符号主要有两类用途,一类是运算符,包括加号+.减号-.乘号*.除号/.取余号%.等号=.大于号>.小于号<.与号&.或号|.非号!.异或号^等等,另一类则是分隔符, ...
- mybatis基础(下)
mybatis和spring整合 需要spring通过单例方式管理SqlSessionFactory spring和mybatis整合生成代理对象,使用SqlSessionFactory创建SqlSe ...
- asyncio异步IO——Streams详解
前言 本文翻译自python3.7官方文档--asyncio-stream,译者马鸣谦,邮箱 1612557569@qq.com.转载请注明出处. 数据流(Streams) 数据流(Streams)是 ...
- 18-10-31 Scrum Meeting 3
1.会议照片 2.每人的工作 昨天完成的工作 1 制定配置 修改配置 查询配置这三个接口 2 3 获取单词对应的中文释义 4 完成测验的部分接口 5 后端对接计划的接口 6 剩余的 ...
- Linux & Windows 环境下 Redis 安装与基本配置
索引: 目录索引 参看代码 GitHub: redis.txt 一.Linux (DeepinOS) 环境 .安装Redis服务 sudo apt-get install redis-server . ...
- 清清楚楚地搭建MongoDB数据库(以搭建4.0.4版本的副本集为例)
数据的目录文件层次设计 我们一般采用多实例的方式,而不是将所有的数据库尽可能地放在一个实例中. 主要基于以下考虑: 1:不同业务线对应的数据库放在不同的实例上,部分操作的运维时间容易协调等到. 2:相 ...
- 从0开始的Python学习007函数&函数柯里化
简介 函数是可以重用的程序段.首先这段代码有一个名字,然后你可以在你的程序的任何地方使用这个名称来调用这个程序段.这个就是函数调用,在之前的学习中我们已经使用了很多的内置函数像type().range ...