`

Spring AOP入门 (二)动态代理

阅读更多
动态代理指的是通过一个代理对象来创建需要的业务对象,然后在这个代理对象中统一进行各种需求的处理。

1. 写一个类实现相应的InvocationHandler接口。

public class LogProxy implements InvocationHandler {
	
	//2. 创建一个代理对象. 由于不知道代理的对象类型,所以这里用Object
	private Object target;
	
	private LogProxy(){}
	
	//3. 创建一个方法来生成对象,这个方法的参数是要代理的对象
	// getInstance所返回的对象就是代理对象。
	public static Object getInstance(Object o){
	    	//3.1 创建LogProxy对象
			LogProxy proxy=new LogProxy();
			
			//3.2 设置这个代理对象
			proxy.target=o;
			
			//3.3 通过Proxy的方法创建代理对象,第一个参数是要代理对象的classloader。
			// 第二个参数是代理对象实现的所有接口。
			// 第三个参数是实现类InvocationHandler的对象。
			// 此时的result就是一个代理对象,代理的是o
			Object result=Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(), proxy);
			return result;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Logger.info("进行了相应的操作");
		System.out.println("method name= "+method.getName());
		Object obj=method.invoke(target, args);
		return obj;
	}

}



2. 在beans.xml中配置一个动态dao:

 <!-- 创建一个动态dao,通过LogProxy实现 -->      <!-- 通过factory-method来指定创建对象的静态方法 -->
         <bean id="userDynamicDao" class="com.lj.proxy.LogProxy" factory-method="getInstance">
         	<constructor-arg ref="userDao"/>  
         	<!-- 这里的userDao就是com.lj.dao.UserDao里的@Repository("userDao") -->
         </bean>


这里相当于通过LogProxy里面的方法创建了一个IUserDao userDynamicDao.
此时我们在service层就不再使用userDao,而是userDynamicDao.

3. 修改UserService.java:
@Resource(name="userDynamicDao")
	private IUserDao userDao;


通过以上的操作,在UserService中的任何一个userDao的操作,都会被记录下来。

======================================================
我们还可以通过Annotatioin类来决定方法是否被记录。

@Retention(RetentionPolicy.RUNTIME)
public @interface LogInfo {
	public String value() default "";
}


再找到IUserDao, 加入注释:

@LogInfo("所有用户都被查询了 by @LogInfo")
	public List<User> list();



最后修改代理类LogProxy:
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		//Logger.info("进行了相应的操作");
		if(method.isAnnotationPresent(LogInfo.class)){
			System.out.println(method.getAnnotation(LogInfo.class).value());
		}
		
		System.out.println("method name= "+method.getName());
		Object obj=method.invoke(target, args);
		return obj;
	}


最后执行list方法,便会看到
所有用户都被查询了 by @LogInfo
method name= list


分享到:
评论

相关推荐

    SpringAOP入门和原理

    SpringAOP入门和原理分析,动态代理

    spring aop注解版

    Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,AOP的原理就是java的动态代理机制

    spring aop管理xml版

    Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,AOP的原理就是java的动态代理机制

    SpringBoot下的SpringAOP-day04-源代码

    SpringBoot下的Spring——DAY04——动态代理总结、AOP、自定义注解进行拦截、动态获取注解参数、通知方法 1.动态代理总结 1.1 JDK动态代理特点 1.2 CGlib动态代理 1.2.1 CGLib特点说明 1.3 动态代理的作用 2 Spring...

    Spring从入门到精通全套教程.zip

    本套课程是Spring入门到精通教程,课程包括Spring IoC、Spring AOP(CGLib、JDK动态代理)、Spring整合MyBatis,Spring事务管理等内容。 通过本套课程的学习,你将掌握: 1、 IoC和依赖注入 2、 AOP的原理和实际...

    SpringAOP学习笔记

    ,文章属于基础级文章,适合入门级的小伙伴,它的概念,应用场景,实现原理及Spring的AOP的开发。全称:面向切面编程(AspectOrientedProgramming),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。...

    【2019版】Spring4.3入门视频课程

    二、Spring AOP AOP简介、实现原理、代理技术 Spring AOP的配置实现 AspectJ表达式 三、Spring注解配置 注解简介 IOC注解 AOP注解 四、Spring整合 Spring整合Web Spring整合JDBC Spring整合MyBatis 教学全程采用笔记...

    Spring高级之注解驱动开发视频教程

    Spring本身里面包含了两大核心IOC和AOP。IOC负责降低我们代码间的依赖关系,使我们的项目灵活度更高,可复用性更强。AOP是让方法间的各个部分更加独立,达到统一调用执行,使后期维护更加的方便。 SpringMVC本身是...

    Spring Boot学习入门之AOP处理请求详解

    AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,下面这篇文章主要给大家介绍了关于Spring Boot学习入门之AOP处理请求的相关资料,...

    开源框架 Spring Gossip

    从代理机制初探 AOP 动态代理 &lt;br&gt;AOP 观念与术语 Spring AOP Advices Advices 包括了Aspect 的真正逻辑,由于缝合至Targets的时机不同,Spring 提供了几种不同的 Advices。 Before ...

    spring.net中文手册在线版

    12.1.3.Spring.NET的AOP代理 12.2.Spring.NET中的切入点 12.2.1.概念 12.2.2.切入点的操作 12.2.3.Spring.NET提供的切入点实现类 12.2.3.1.静态切入点 12.2.3.2.动态切入点 12.2.4.自定义切入点 12.3.Spring.NET的...

    spring boot 实践学习案例,与其它组件整合

    spring boot 实践学习案例,与其它组件结合如 mybatis、jpa、dubbo、redis、mongodb、memcached、kafka、... - Spring Cloud 入门,包括 Eureka(服务注册与发现)、Config(配置中心)、Hystrix(断路器)、Bus(消息总线) 等

    Spring入门到精通2017视频教程

    掌握系统框架设计原理,工厂模式,委托模式的实现,Spring的IOC依赖注入技术,Struts2,Hibernate与Spring的整合,ApplicationContext读取资源文件的3种方法,多个配置文件的加载与导入,静态代理与动态代理,...

    Spring.3.x企业应用开发实战(完整版).part2

    10.6.1 哪些方法不能实施Spring AOP事务 10.6.2 事务增强遗漏实例 10.7 数据连接泄漏 10.7.1 底层连接资源的访问问题 10.7.2 Spring JDBC数据连接泄漏 10.7.3 通过DataSourceUtils获取数据连接 10.7.4 通过...

    spring-zwz.zip

    spring一篇入门博文的配套资源,包含了第一个spring程序、IOC控制反转、DI依赖注入、静态代理、动态代理、AOP面向切面编程等源代码

    Spring3.x企业应用开发实战(完整版) part1

    10.6.1 哪些方法不能实施Spring AOP事务 10.6.2 事务增强遗漏实例 10.7 数据连接泄漏 10.7.1 底层连接资源的访问问题 10.7.2 Spring JDBC数据连接泄漏 10.7.3 通过DataSourceUtils获取数据连接 10.7.4 通过...

    spring security 参考手册中文版

    第二部分 架构与实现 73 9.技术概述 73 9.1运行环境 73 9.2核心组件 74 9.2.1 SecurityContextHolder,SecurityContext和认证对象 74 获取有关当前用户的信息 75 9.2.2 UserDetailsService 75 9.2.3授予权力 77 ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    第二部分 点睛Spring MVC 4.x 第4 章 Spring MVC 基础 72 4.1 Spring MVC 概述 73 4.2 Spring MVC 项目快速搭建 74 4.2.1 点睛 74 4.2.2 示例 74 4.3 Spring MVC 的常用注解 82 4.3.1 点睛 82 4.3.2 示例 83 4.4 ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    第二部分 点睛Spring MVC 4.x 第4 章 Spring MVC 基础 72 4.1 Spring MVC 概述 73 4.2 Spring MVC 项目快速搭建 74 4.2.1 点睛 74 4.2.2 示例 74 4.3 Spring MVC 的常用注解 82 4.3.1 点睛 82 4.3.2 示例 83 4.4 ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    第二部分 点睛Spring MVC 4.x 第4 章 Spring MVC 基础 72 4.1 Spring MVC 概述 73 4.2 Spring MVC 项目快速搭建 74 4.2.1 点睛 74 4.2.2 示例 74 4.3 Spring MVC 的常用注解 82 4.3.1 点睛 82 4.3.2 示例 83 4.4 ...

Global site tag (gtag.js) - Google Analytics