使用spring框架进行aop编程实现方法调用前日志输出
aop编程 之使用spring框架实现方法调用前日志输出
使用spring框架实现AOP编程首先需要搭建spring框架环境:
使用Spring框架实现AOP工程编程之后,不需要我们去写代理工厂了,工厂的实例化由spring框架完成。
spring框架生成代理对象的秘密:
1. 如果面向接口编程,那么底层采用jdk动态代理生成目标对象
2. 如果没有面向接口编程,那么底层采用cglib动态代理生成目标对象
由于spring的封装,使得我们实现AOP编程变得简单。
搭建Spring环境:引入Jar包,并且添加到构建路径中去

面向接口编程的方式(底层采用jdk动态代理生成目标对象)
首先编写目标对象的接口UserDaoIfac,添加一个删除用户的方法
package net.neuedu.spring.test;
public interface UserDaoIfac {
Integer deleteUser(Integer userId);
}
编写目标对象,实现刚刚写的接口
package net.neuedu.spring.test;
public class UserDao implements UserDaoIfac {
@Override
public Integer deleteUser(Integer userId)
{
System.out.println("deleteUser:"+userId);
return userId;
}
}
编写日志输出类LogOutput,实现MethodBeforeAdvice(前置通知的接口)并且实现它的接口
package net.neuedu.spring.test;
import java.lang.reflect.Method;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.aop.MethodBeforeAdvice;
public class LogOutput implements MethodBeforeAdvice {
private Logger log=Logger.getLogger("net.neuedu.spring.test.LogOutput");
//net.neuedu.spring.test.LogOutput这个是日志输出的对象
@Override
public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
log.log(Level.INFO,"日志输出");
}
}
接下来配置beans.xml文件
<?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">
<!-- 实例化UserDao -->
<bean id="userDao" class="net.neuedu.spring.test.UserDao">
</bean>
<!-- 实例化LogOutput对象 -->
<bean id="logOutput" class="net.neuedu.spring.test.LogOutput"></bean>
<!-- userDao代理对象,需要配三个参数
proxyInterfaces:代理对象的接口,由spring代理工厂提供
interceptorNames:拦截器名称,日志输出就是拦截器
target:目标对象,userDao就是目标对象
-->
<bean id="userDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces" value="net.neuedu.spring.test.UserDaoIfac"></property>
<property name="interceptorNames">
<list>
<value>logOutput</value>
</list>
</property>
<property name="target" ref="userDao"></property>
</bean>
</beans>
编程测试类, 如下:
package net.neuedu.spring.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext act=new ClassPathXmlApplicationContext("beans.xml");
UserDaoIfac userDaoProxy=(UserDaoIfac) act.getBean("userDaoProxy");
userDaoProxy.deleteUser(100);
}
}
看控制台输出结果:

不面向接口编程(底层采用cglib动态代理生成目标对象)
那么接下来 就是不面向接口编程的方法
编写一个BookDao类
package net.neuedu.spring.test;
//不面向接口编程
public class BookDao {
public void addBook(String bookName)
{
System.out.println("添加图书:"+bookName);
}
}
日输出类LogOutput,并且实现MethodBeforeAdvice接口(与前面的LogOutput一样)
package net.neuedu.spring.test;
import java.lang.reflect.Method;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.aop.MethodBeforeAdvice;
public class LogOutput implements MethodBeforeAdvice {
private Logger log=Logger.getLogger("net.neuedu.spring.test.LogOutput");
//net.neuedu.spring.test.LogOutput这个是日志输出的对象
@Override
public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
log.log(Level.INFO,"调用方法之前日志输出+++++++++++++");
}
}
配置beans.xml文件:
不面向接口编程配置xml文件会更加简单,只需要配置拦截器和目标对象即可,代码如下:
<bean id="bookDao" class="net.neuedu.spring.test.BookDao"></bean>
<bean id="bookDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="bookDao"></property>
<property name="interceptorNames">
<list>
<value>logOutput</value>
</list>
</property>
</bean>
编写测试类:
package net.neuedu.spring.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext act=new ClassPathXmlApplicationContext("beans.xml");
BookDao bookDaoProxy=(BookDao) act.getBean("bookDaoProxy"); //获取代理对象
bookDaoProxy.addBook("水浒传");
}
}
结果如下:

使用spring框架进行aop编程实现方法调用前日志输出的更多相关文章
- Spring框架的AOP编程,最通俗的语言解释,易懂易学
第七章:AOP技术 前言: AOP技术是根据动态代理设计模式进行的技术.动态代理技术分jdk动态代理和cglib动态代理 jdk动态代理特点: (1)继承java.lang.reflect.proxy ...
- 10.Spring——框架的AOP
1.Spring 框架的 AOP 2.Spring 中基于 AOP 的 XML架构 3.Spring 中基于 AOP 的 @AspectJ 1.Spring 框架的 AOP Spring 框架的一个关 ...
- Spring入门3.AOP编程
Spring入门3.AOP编程 代码下载: 链接: http://pan.baidu.com/s/11mYEO 密码: x7wa 前言: 前面学习的知识是Spring在Java项目中的IoC或DJ,这 ...
- Spring 框架的 AOP 简介
Spring 框架的 AOP Spring 框架的一个关键组件是面向方面的编程(AOP)(也称为面向切面编程)框架. 面向方面的编程需要把程序逻辑分解成不同的部分称为所谓的关注点. 跨一个应用程序的多 ...
- Spring框架之AOP源码完全解析
Spring框架之AOP源码完全解析 Spring可以说是Java企业开发里最重要的技术.Spring两大核心IOC(Inversion of Control控制反转)和AOP(Aspect Orie ...
- Spring框架的AOP技术(注解方式)
1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包 * 先引入Spring框架开发的基本开发包 * 再引入Spring框架的AOP的开发包 * spring的传统AOP的开发的包 * sp ...
- Spring同一个类中的注解方法调用AOP失效问题总结
public interface XxxService { // a -> b void a(); void b(); } @Slf4j public class XxxServiceImpl ...
- 使用WCF扩展在方法调用前初始化环境
使用WCF扩展在方法调用前初始化环境 OperationInvoker 介绍 OperationInvoker 是 WCF 运行时模型中在调用最终用户代码前的最后一个扩展点,OperationInvo ...
- Spring框架(4)---AOP讲解铺垫
AOP讲解铺垫 不得不说,刚开始去理解这个Aop是有点难理解的,主要还是新的概念比较多,对于初学者一下子不一定马上能够快速吸收,所以我先对什么事Aop做一个解释: 首先说明:本文不是自己所写 ...
随机推荐
- ImageMagick:用identify得到图片的平均颜色(基本颜色/主色调)
一,平均颜色的用途: 很多app在流式的展示图片时, 在图片没加载出来之前, 不是使用统一的背景图, 而是先显示一个纯色的背景, 而背景色和图片的颜色非常接近, 这样给用户的体验会更好. 我们这里演示 ...
- 第四章 Bash Shell 的简单应用
一.Bash Shell 的简单介绍 1.什么是bash shell? 是一个命令解释器 它在操作系统的最外面 负责用户与内核进行交互的一种接口 将用户输入的命令翻译给操作系统,并将处理后的结果输出到 ...
- ImageLoader简介和使用方法
1.功能概要 Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示. (1).使用多线程加载图片(2) ...
- ASP.NET Core托管运行Quartz.NET作业调度详解
Quartz.NET这么NB的作业调度系统,不会还行? 今天介绍一下Quartz.NET的托管运行,官网传送门. 一.前言 Quartz.NET,按官网上的说法,是一款功能齐全的任务调度系统,从小 ...
- 小白也能看懂的JVM内存区域
前言 最近在准备面试题刷到了JVM这块,作为一个小白,巩固知识点最好的方式就是亲手写出来并分享:相信我的理解,同样是小白的你,一定有很大的帮助.不信,请你往下看! JVM内存区域简介 如果有人问Jav ...
- RocketMQ 4.7.1 环境搭建、集群、MQ整合SpringBoot
导读 之前学过ActiveMQ但是并发量不是很大点我直达,所以又学阿里开源的RocketMQ,据说队列可以堆积亿级别.下面是网上找的消息队列对比图,仅供参考 部署 官网 点我直达 前置条件 推荐使用6 ...
- spring基础学习
ClassXmlAplicationContext和FileSystemXmlApplicationContext的区别 https://www.cnblogs.com/sxdcgaq808 ...
- D. Equalize the Remainders 解析(思維)
Codeforce 999 D. Equalize the Remainders 解析(思維) 今天我們來看看CF999D 題目連結 題目 略,請直接看原題 前言 感覺要搞個類似\(stack\)的東 ...
- 续 Eureka+Hystrix+Zuul(Zuul API网关)
概述: 服务的合并,转发,验证,异构协议.将上百个请求融为一个发送到后台,返回大的JSON返回处理: 作用:这减少了客户端与应用程序间的交互次数,还简化了客户端代码. Zuul可以通过加载动态过滤机制 ...
- Web前端_流式布局(百分比布局)
移动Web_流式布局(百分比布局) writer:late at night codepeasant 1(百分比布局) ☞核心知识点 1.流式布局(百分比布局) 2.视口设置 ☞今日目标 1. 能够使 ...