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. es6深层次数组深拷贝

    let arr = [       {         label: '1',         children: [1, 2]       }     ] let a = [{...arr[0]}] ...

  2. ubuntu下vi不能正常使用的解决方法

    现象 ubuntu中vi在编辑状态下方向键不能用,还有回格键不能删除等我们平时习惯的一些键都不能使用. 原因 ubuntu预装的是vim tiny版本,需要的是vim full版本. 方案 $sudo ...

  3. python 字典使用——增删改查

    创建字典 dict= {key1 : value1, key2 : value2 } key : value 为键值对 增: dict[key] = value 删: del dict[key] 改: ...

  4. selenium常用操作学习笔记

    一,弹窗处理(推荐文章:https://blog.csdn.net/huilan_same/article/details/52298460) selenium提供switch_to方法定位弹窗的对话 ...

  5. textarea在编程中的实际应用

    <textarea> 标签定义多行的文本输入控件. 文本区中可容纳无限数量的文本,其中的文本的默认字体是等宽字体(通常是 Courier) 实例 <textarea rows=&qu ...

  6. 字符集、字符编码、国际化、本地化简要总结(UNICODE/UTF/ASCII/GB2312/GBK/GB18030)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明   普通的linux 和 普通的windows.    ...

  7. springboot入门系列(五):SpringBoot连接多RabbitMQ源

    SpringBoot连接多RabbitMQ源 在实际开发中,很多场景需要异步处理,这时就需要用到RabbitMQ,而且随着场景的增多程序可能需要连接多个RabbitMQ.SpringBoot本身提供了 ...

  8. TNS-12541 TNS no listener

    转载:https://blog.csdn.net/haha_201510/article/details/88119587 centOS环境下的解决方案: 查看监听状态lsnrctl status 如 ...

  9. ThreadLocal与Thread与Runable之间的关系

    ThreadLocal继承Object,相当于没继承任何特殊的. ThreadLocal没有实现任何接口. ThreadLocal并不是一个Thread,而是Thread的局部变量

  10. 用 Span 对 C# 进程中三大内存区域进行统一访问 ,太厉害了!

    一:背景 1. 讲故事 前段时间写了几篇 C# 漫文,评论留言中有很多朋友多次提到 Span,周末抽空看了下,确实是一个非常