众所周知,Spring的诞生为Java Web业务层的开发带来了极大的便利,表现最为突出的就是它的两点:一、IOC(控制反转或依赖注入);二、AOP(切面编程)
IOC的用法比较简单,它通过配置文件的方式将一个个对象在WEB容器加载时创建并传递给注入对象使用。
而AOP的核心思想就是将一些与业务无关的代码块(如,日志管理或事务管理)单独抽出,以动态代理的方式以切面的形式植入调用业务代码的前后。下面我们将以一个简单的Java动态代理的例子来解释AOP的原理。
此部分代码分为四个类:
一、IUserService接口,在此接口中提供一些常用的业务方法,如添加或是删除用户。
二、UserServiceImpl类,实现IUserService接口。
三、UserServiceFactory类,一个实现了Singleton模式的工厂类,运用动态代理的机制生产IUserService对象。
四、ProxyTest类,该类用于测试。
以下是四个类中的代码,
// IUserService.java
package com.pattern.proxy;
public interface IUserService {
public void createUser();
public void updateUser();
}
// UserServiceImpl.java
package com.pattern.proxy;
public class UserServiceImpl implements IUserService {
@Override
public void createUser() {
System.out.println("Create User Successfully");
}
@Override
public void updateUser() {
System.out.println("Update User Successfully");
}
}
// UserServiceFactory
package com.pattern.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
*
* @author zhanxiao
* @date 2009-11-28
*
* To product UserService instance
*
*/
public class UserServiceFactory {
private static UserServiceFactory instance = new UserServiceFactory();
private UserServiceFactory() {
// TODO Auto-generated constructor stub
}
/**
*
* @return
* zhanxiao
*/
public static UserServiceFactory getInstance() {
if (instance == null) {
instance = new UserServiceFactory();
}
return instance;
}
// Get a IUserService instance
public IUserService createUserService() {
return (IUserService) Proxy.newProxyInstance(IUserService.class
.getClassLoader(), new Class[] { IUserService.class },
new ServiceHandler("com.pattern.proxy.UserServiceImpl"));
}
/**
* A inner class implements InvocationHandler interface
* @author zhanxiao
* @date 2009-12-5
*/
private class ServiceHandler implements InvocationHandler {
private String className;
/**
*
* @param className Proxy ClassName including package name
*/
public ServiceHandler(String className) {
this.className = className;
}
@Override
/**
* invoke the proxy class's method
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("Proxy is working...");
return method.invoke(Class.forName(className).newInstance(), args);
}
}
}
// ProxyTest.java
package com.pattern.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyTest {
public static void main(String[] args) throws Exception {
UserServiceFactory.getInstance().createUserService().createUser();
}
}
测试结果如下:
Proxy is working...
Create User Successfully
小结:在createUserService中我们使用了Proxy类的newProxyInstance方法为目标对象(UserServiceImpl)生成了一个代理对象。值得注意的是该方法的几个参数:第一个参数为代理对象的类加载器,第二个参数是个类型为Class的数组,这里数组只有一个元素,即为代理类,而第三个参数为一个代理的处理类,我们可以把诸如日志管理等代码放在这个类的invoke方法里实现。
本人小菜一个,希望大虾指正。(QQ:226313711)
分享到:
相关推荐
在Spring框架中,AOP(面向切面编程)就是基于Java动态代理来完成的,用于实现横切关注点,如日志、事务管理等。这篇博客的文章链接虽然没有给出具体内容,但我们可以根据Java动态代理和Spring AOP的基本概念来深入...
因此,在实际开发中,需要根据应用场景的性能要求和维护需求,权衡是否使用动态代理。 总之,AOP通过提供一种新的角度来解决OO编程中存在的问题,使得我们能够在保持业务逻辑清晰的同时,增加额外的通用功能。利用...
现在让我们深入探讨JDK动态代理和Spring AOP的原理。 首先,JDK动态代理基于Java的反射机制,通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建一个代理对象,...
本文将深入探讨Spring AOP的实现原理,以及如何使用反射来实现动态代理模式。 首先,我们需要了解AOP的基本概念。AOP的核心思想是切面,它包含两个主要部分:切点(Pointcut)和通知(Advice)。切点定义了在程序...
为了说明Spring的AOP原理,本人使用代理模式中的动态代理完成演示AOP编程的原理的演示。相信,如果你耐心看完整个程序(几乎一行注释一行代码),那么你对Spring这个东西就不是觉得有什么神秘了! 阅读对象:凡是喜爱...
Spring AOP 的底层实现技术 --- Jdk 动态代理原理 JDK 动态代理是 Spring AOP 的底层实现技术,允许开发者在运行期创建接口的代理实例。在 JDK 1.3 以后,JDK 动态代理技术提供了实现 AOP 的绝好底层技术。JDK 动态...
总的来说,通过Java的动态代理模拟Spring AOP可以帮助我们理解AOP的基本原理,并在实际项目中实现一些简单的切面逻辑。然而,对于更复杂的需求,如跨越多个方法的事务管理,Spring AOP提供了更全面的解决方案。熟悉...
- 当目标对象实现了至少一个接口时,Spring会使用JDK的java.lang.reflect.Proxy类创建一个代理对象。 - 代理对象在调用实际方法前后,会插入相应的通知代码,从而实现AOP功能。 - **CGLIB代理**: - 如果目标...
### Spring AOP面向方面编程原理:AOP概念详解 #### 一、引言 随着软件系统的日益复杂,传统的面向对象编程(OOP)...对于希望深入了解Spring AOP原理与实践的读者来说,掌握以上概念将是开启面向方面编程之旅的第一步。
在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者定义“切面”,...通过理解JDK动态代理的工作原理和Spring AOP的相关概念,我们可以更好地利用这一强大功能,提升应用程序的可维护性和灵活性。
Java动态代理是Java提供的一种在运行时创建代理对象的技术,它是实现类似Spring AOP(面向切面编程)功能的关键机制之一。AOP允许我们在不修改已有代码的情况下,向程序添加额外的功能,比如日志记录、性能监控、...
从文件内容可以看出,文档主要讨论了如何使用Java动态代理来实现AOP的基本原理。文档中提供了一个简单的例子,其中定义了一个业务接口BusinessInterface和一个实现了该接口的BusinessObject类。BusinessObject类中的...
在Java开发领域,Spring框架是不可或缺的一部分,而Spring AOP(面向切面编程)则是Spring框架中的重要特性,它提供了一种优雅的方式来处理系统中的横切关注点,如日志、事务管理等。本篇文章将深入探讨如何通过XML...
Spring 使用 `java.lang.reflect.Proxy` 类来创建动态代理,并通过实现 `java.lang.reflect.InvocationHandler` 接口来处理代理对象的方法调用。在 Spring AOP 中,`org.springframework.aop.framework....
6. **代理(Proxy)**:Spring AOP通过动态代理实现切面的织入。对于接口,使用JDK动态代理;对于非接口类,使用CGLIB动态代理。 Spring的IOC和AOP机制使得开发者能够更专注于业务逻辑,而不是繁琐的依赖管理和横切...
在提供的源码文件中,可能包含了示例代码,如自定义的`InvocationHandler`实现、切点定义、通知配置等,你可以通过这些例子深入理解动态代理和Spring AOP的工作原理。 总结起来,动态代理和Spring AOP是Java和...
Spring AOP使用两种主要的代理技术:JDK动态代理和CGLIB动态代理。JDK动态代理适用于接口的场景,而CGLIB则用于没有实现接口的情况。在这两种情况下,代理对象都会持有目标对象的引用,并在其上调用方法。具体来说:...
学习这些示例,你可以更深入地理解Spring AOP的工作原理,掌握如何使用动态代理和责任链模式来编写切面,以及如何通过注解简化AOP的配置和使用。这些知识对于任何涉及Spring框架的开发者来说都是至关重要的,因为...
本示例将简要介绍如何在Spring应用中实现AOP,通过实际的代码示例帮助理解其工作原理。 首先,我们要理解AOP的核心概念。AOP是一种编程范式,它允许开发者定义“切面”(Aspects),这些切面封装了特定的关注点,如...