使用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做一个解释: 首先说明:本文不是自己所写 ... 
随机推荐
- c++11 R+字符串
			R+字符串 prefix(optional) R"delimiter(raw_characters)delimiter" (6) (since C++11) C++11引入了原始字 ... 
- centos8环境判断当前操作系统是否虚拟机或容器
			一,阿里云ECS的centos环境 1,执行systemd-detect-virt [root@yjweb ~]# systemd-detect-virt kvm 说明阿里云的ecs是在一个kvm环境 ... 
- ansible通过yum/dnf模块给受控机安装软件(ansible2.9.5)
			一,使用yum/dnf模块要注意的地方: 使用dnf软件安装/卸载时,需要有root权限, 所以要使用become参数 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnb ... 
- doker基本使用
			Docker与虚拟机的区别 docker和虚拟机最大的不同,docker共用宿主机的内核,虚拟机中每个虚拟机中有单独的内核虚拟出来,如上图所示: docker不能做后端兼容性测试,因为其没有独立的虚拟 ... 
- MySql中varchar和char,如何选择合适的数据类型?
			背景 学过MySQL的同学都知道MySQL中varchar和char是两种最主要的字符串类型,varchar是变长的类型,而char是固定长度.那关于如何选择类型就成为令人头疼的事,很多初学者为了保证 ... 
- 给萌新HTML5 入门指南
			本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. HTML5的发展改变了互联网技术趋势,前端热度依旧不减,所以对于应用开发人员 ... 
- jQuery load() 中文乱码
			1.使用editplus创建了demo.txt (ANSI保存的), $("#div1").load("demo.txt");//div显示中文乱码---> ... 
- Map 和 Json 互转
			Json 转 Map<String,String> String query = "{tableName:\"iov_biz_car_info\",selec ... 
- ucore操作系统学习(四) ucore lab4内核线程管理
			1. ucore lab4介绍 什么是进程? 现代操作系统为了满足人们对于多道编程的需求,希望在计算机系统上能并发的同时运行多个程序,且彼此间互相不干扰.当一个程序受制于等待I/O完成等事件时,可以让 ... 
- Centos7安装Gitlab11
			一.基础介绍 1.简介 一个基于GIT的源码托管解决方案 基于rubyonrails开发 集成了nginx postgreSQL redis sidekiq等组件 2.安装要求 2g内存以上,有点占内 ... 
