`

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


分享到:
评论

相关推荐

    spring AOP入门实例

    在这个入门实例中,我们将深入理解Spring AOP如何实现简单日志记录。 首先,AOP的核心概念包括切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和织入(Weaving)。切面是AOP中的核心...

    spring AOP入门教程

    - **SpringAOP.avi**:可能是一个视频教程,详细讲解了Spring AOP的概念和实践。 - **SpringAOP.doc**:可能是文档教程,包含了详细的步骤和示例代码。 - **SpringAOP_src.rar**:源代码示例,供你参考和实践。 - **...

    最简单的SpringAOP入门案例

    本教程将通过一个简单的Spring AOP入门案例,帮助初学者理解这一概念。 ### 一、AOP基础 1. **切面(Aspect)**:切面是关注点的模块化,它封装了跨越多个对象的行为或数据。在Spring AOP中,切面可以由一个类定义...

    Spring 入门案例——AOP

    5. **自动代理(Auto Proxy)**:Spring AOP默认使用Java动态代理或CGLIB生成代理对象,以便在调用目标方法时插入通知。 案例中的"Spring_2_AOP"可能包含了以下内容: - 示例代码展示了如何定义一个切面,包括通知...

    Spring AOP 入门实例1

    以下是一个简单的Spring AOP入门实例步骤: 1. 首先,定义一个切面类,包含通知方法。例如,一个简单的日志切面: ```java @Aspect @Component public class LoggingAspect { @Before("execution(* com.example*...

    Spring AOP 入门实例

    **Spring AOP 入门实例** 在Java编程中,面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,它允许程序员定义“横切关注点”,如日志、事务管理、性能监控等,然后将这些关注点与核心业务逻辑...

    Spring AOP入门及其实例讲解、下载

    **Spring AOP 入门及其实例讲解** 在软件开发中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种编程范式,它旨在提高代码的可重用性,减少冗余,并将关注点分离。Spring框架是Java开发中的一个流行...

    SPRING AOP详细培训视频

    5. 代理(Proxy):Spring AOP通过动态代理机制创建一个对象的代理,代理对象负责在方法调用前后执行通知。有两种类型的代理:JDK动态代理和CGLIB代理。JDK动态代理适用于实现了接口的目标对象,而CGLIB代理则用于未...

    Spring AOP简单demo

    **Spring AOP 简介** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要模块,它扩展了传统的面向对象编程,允许开发者定义“横切关注点”(cross-cutting concerns),如日志、事务...

    spring的aop简单例子

    Spring的AOP(面向切面编程)是一种编程范式,它允许程序员在不修改源代码的情况下,通过插入称为切面的代码片段来增强程序的功能。这个简单例子将帮助我们理解AOP的基本概念和如何在Spring框架中实现它。 首先,...

    Spring_Aop入门例子

    5. **代理(Proxy)**:Spring AOP通过动态代理机制,创建目标对象的代理对象来实现切面的织入。有两种代理方式:JDK动态代理和CGLIB代理。JDK代理适用于实现了接口的类,而CGLIB代理则用于未实现接口的类。 在...

    Spring AOP快速入门_源码

    Spring AOP的实现原理基于动态代理,对于接口实现类,Spring会使用JDK的动态代理,而对于没有接口的类,Spring会使用CGLIB库生成一个子类来实现动态代理。代理对象会在目标方法调用前后插入通知代码,从而实现AOP的...

    spring aop注解版

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理等。在本主题中,我们将深入探讨Spring AOP的注解版,它是基于Java注解的...

    SpringAOP入门

    Spring AOP使用的就是动态代理机制,它可以根据不同的情况选择JDK动态代理或CGLIB动态代理来创建代理对象。JDK动态代理基于接口实现,如果目标对象实现了某个接口,Spring就会使用JDK动态代理;如果没有实现接口,...

    springAOP-dome

    在这个名为"springAOP-dome"的实例中,我们将探讨如何利用Spring AOP实现一个简单的日志记录功能,以作为入门学习。 首先,了解AOP的基本概念是必要的。面向切面编程是一种编程范式,旨在解决程序中的横切关注点,...

    spring2-aop入门实例教程

    ### Spring2-AOP入门实例教程知识点详解 #### 一、Spring框架概述 - **轻量级J2EE开发框架**:Spring是一个轻量级的Java应用框架,它为开发复杂的企业级应用提供了一种简化的方法。 - **发展历程**:自2002年发布...

    Spring 入门AOP材料

    以上就是一个简单的Spring AOP入门介绍。通过学习和实践,你可以更好地理解如何在实际项目中利用AOP来提高代码的可维护性和灵活性。在后续的学习中,你还可以探索更高级的特性,如自定义通知类型和使用AspectJ的编织...

    spring aop管理xml版

    Spring支持运行时织入和编译时织入,其中运行时织入更为常见,它可以在应用运行时动态地创建代理对象。 在"Spring AOP管理XML版"中,我们主要关注的是通过XML配置来管理AOP。以下是一些关键的XML配置元素: - `...

    spring aop 详细介绍

    5. **Spring AOP入门**: Spring AOP通过XML配置或者注解方式来实现AOP功能。在XML配置中,可以定义Bean、Advisor、Pointcut等元素。在注解方式下,可以使用`@Aspect`、`@Before`、`@After`、`@AfterReturning`、`@...

Global site tag (gtag.js) - Google Analytics