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编程实现方法调用前日志输出的更多相关文章

  1. Spring框架的AOP编程,最通俗的语言解释,易懂易学

    第七章:AOP技术 前言: AOP技术是根据动态代理设计模式进行的技术.动态代理技术分jdk动态代理和cglib动态代理 jdk动态代理特点: (1)继承java.lang.reflect.proxy ...

  2. 10.Spring——框架的AOP

    1.Spring 框架的 AOP 2.Spring 中基于 AOP 的 XML架构 3.Spring 中基于 AOP 的 @AspectJ 1.Spring 框架的 AOP Spring 框架的一个关 ...

  3. Spring入门3.AOP编程

    Spring入门3.AOP编程 代码下载: 链接: http://pan.baidu.com/s/11mYEO 密码: x7wa 前言: 前面学习的知识是Spring在Java项目中的IoC或DJ,这 ...

  4. Spring 框架的 AOP 简介

    Spring 框架的 AOP Spring 框架的一个关键组件是面向方面的编程(AOP)(也称为面向切面编程)框架. 面向方面的编程需要把程序逻辑分解成不同的部分称为所谓的关注点. 跨一个应用程序的多 ...

  5. Spring框架之AOP源码完全解析

    Spring框架之AOP源码完全解析 Spring可以说是Java企业开发里最重要的技术.Spring两大核心IOC(Inversion of Control控制反转)和AOP(Aspect Orie ...

  6. Spring框架的AOP技术(注解方式)

    1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包 * 先引入Spring框架开发的基本开发包 * 再引入Spring框架的AOP的开发包 * spring的传统AOP的开发的包 * sp ...

  7. Spring同一个类中的注解方法调用AOP失效问题总结

    public interface XxxService { // a -> b void a(); void b(); } @Slf4j public class XxxServiceImpl ...

  8. 使用WCF扩展在方法调用前初始化环境

    使用WCF扩展在方法调用前初始化环境 OperationInvoker 介绍 OperationInvoker 是 WCF 运行时模型中在调用最终用户代码前的最后一个扩展点,OperationInvo ...

  9. Spring框架(4)---AOP讲解铺垫

    AOP讲解铺垫      不得不说,刚开始去理解这个Aop是有点难理解的,主要还是新的概念比较多,对于初学者一下子不一定马上能够快速吸收,所以我先对什么事Aop做一个解释: 首先说明:本文不是自己所写 ...

随机推荐

  1. Python3.7有什么新变化

    https://docs.python.org/zh-cn/3/whatsnew/3.7.html

  2. 扫描仪扫描文件处理-A4分辨率

    转换公式:毫米转英寸,英寸乘以DPI(每英寸点数) 1英寸 = 2.54 厘米 = 25.4 毫米 例子(600dpi):mm: 210x297 = px: 4961(210/25.4*600)x70 ...

  3. linux(centos8):安装java jdk 14 (java 14.0.2)

    一,下载jdk14 官方网站: https://www.oracle.com/java/ 下载页面: https://www.oracle.com/cn/java/technologies/javas ...

  4. centos8平台:举例讲解redis6的ACL功能(redis6.0.1)

    一,为什么redis6要增加acl功能模块? 什么是acl? 访问控制列表(ACL)是一种基于包过滤的访问控制技术, 它可以根据设定的条件对接口上的数据包进行过滤,允许其通过或丢弃 redis6增加了 ...

  5. electron-updater实现更新electron应用程序

    electron-updater实现更新electron应用程序 第一步 安装"electron-updater": "^4.3.5", 打开package.j ...

  6. Java进阶专题(十五) 从电商系统角度研究多线程(下)

    前言 ​ 本章节继上章节继续梳理:线程相关的基础理论和工具.多线程程序下的性能调优和电商场景下多线程的使用. 多线程J·U·C ThreadLocal 概念 ​ ThreadLocal类并不是用来解决 ...

  7. 作用域 - Js深入理解笔记

    执行期上下文 当函数执行时,会创建一个称为执行上下文的内部对象 一个执行期上下文定义了一个函数所执行时的环境,函数每次执行时对应的执行上下文都是独一无二的,多次调用一个函数会导致创建多个执行上下文,当 ...

  8. golang开发:http请求redirect的问题

    这两天在开发项目的时候遇到了一个问题,请求了一个URL,它会302到另一个地址,本意上只是想检查这个URL是否会做3XX的redirect跳转,结果每次reqeust都会返回最后一跳的结果.后来就看了 ...

  9. AWK实现把一个文件根据内容进行分组输出多个文件

    AWK实现把一个文件根据内容进行分组输出多个文件 1.首先准备文件data.txt(分隔符为tab) 第一列省编码,第二列省名称...... 2.将该大文件根据第一列的省编码进行分组并输出到各个省编码 ...

  10. xlrd加载Excal表格编码格式的问题

    Python自动化测试中,利用xlrd加载文件名,代码如下: newpath = os.chdir('文件所在目录') filename = "文件名.xlsx" 报IOError ...