代理模式分为静态代理和动态代理。静态代理就是我们自己定义的代理类,动态代理是程序在运行时生成的代理类。
静态代理示例
Service.java
package com.javacrazyer.dao;
public interface Service {
public void outPut();
public void putOut();
}
ServiceImpl.java
package com.javacrazyer.dao;
public class ServiceImpl implements Service {
@Override
public void outPut() {
System.out.println("I am method outPut");
}
@Override
public void putOut() {
System.out.println("I am method putOut.");
}
}
至于上面两个类大家随便举例子,无论是增删改还是什么都可以的
测试类TestProxy.java
package com.javacrazyer.dao;
public class TestProxy {
public static void main(String[] args) {
Service serviceImp = new ServiceImpl();
serviceImp.outPut();
serviceImp.putOut();
}
}
如我们所想,理所当然的输出了
I am method outPut
I am method putOut
下面我们需要加入安全性检查,就是调用方法前我们需要进行验证,比较常见的就是权限验证,验证用户是否拥有权限,
比较常见的做法就是在ServiceManagerImplProxy类中定义一个检查安全性的方法:
好了,这样一说,又得出现一个ServiceManagerImplProxy.java
package com.javacrazyer.dao;
public class ServiceManagerImplProxy implements Service {
private Service service;
public ServiceManagerImplProxy(Service service){
this.service=service;
}
@Override
public void outPut() {
//在调用方法前调用验证方法
this.checkSecurity();
this.service.outPut();
}
@Override
public void putOut() {
//在调用方法前调用验证方法
this.checkSecurity();
this.service.putOut();
}
public void checkSecurity()
{
System.out.println("--------ServiceManagerImpl.checkSecurity()----------");
}
}
修改下测试代码
package com.javacrazyer.dao;
public class TestProxy {
public static void main(String[] args) {
ServiceManagerImplProxy serviceImp = new ServiceManagerImplProxy(new ServiceImpl());
serviceImp.outPut();
serviceImp.putOut();
}
}
输出结果
--------ServiceManagerImpl.checkSecurity()----------
I am method outPut
--------ServiceManagerImpl.checkSecurity()----------
I am method putOut
这样总的来说比较灵活。这个依赖关系是我们自己做的,我们完全可以交给spring处理。
按照上面的这种做法有一个缺点,如果接口中方法很多,那么我们实现每一个方法都要添加检查方法checkSecurity(),影响了我们的业务处理。采用静态代理模式我们是没法解决的,这时我们需要使用AOP思想。【AOP底层原理就是动态代理和反射机制】
动态代理示例
使用动态代理我们需要声明一个类SecurityHandler,那么之前的ServiceManagerImplProxy类就不需要了,这个类要实现InvocationHandler接口。在类中定义一个产生动态代理的方法newProxy();同时把我们验证的代码放到这个类中。通过SecurityHandler,当我们调用方法时默认会调用SecurityHandler类invoke方法,我们在这个方法中进行安全性检查,检查通过后在调用真实的方法。需要注意的是目标对象接口中的部分方法是存在返回值的。
SecurityHandler.java
package com.javacrazyer.dao;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 动态代理的处理类: 只针对实现了接口的类才能创建出它的代理对象
* @author cheneywu
*
*/
public class SecurityHandler implements InvocationHandler {
private Object originalObject;
// 将欲代理的对象传入,返回一个代理对象
public Object newProxy(Object obj) {
this.originalObject = obj;
// 三个参数,第一个是欲代理对象的类加载器,第二个是得到这个类的接口集合,第三个参数是一个handler
return (Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj
.getClass().getInterfaces(), this));
}
// 对欲代理对象的方法的调用将会调用这个代理对象的invoke方法
// 第一个参数是这个代理对象,第二个参数是欲代理对象实现方法,第三个是方法的参数集合
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
checkSecurity();
// 若方法名以out开头则调用下面逻辑
if (method.getName().startsWith("out")) {
System.out.println("This is a method invoking before the method that was intercepted.");
// 调用欲代理对象的相应方法
method.invoke(originalObject, args);
System.out.println("This is a method invoking after the method that was intercepted.");
} else {
// 若不是需要拦截的方法则正常执行方法
method.invoke(originalObject, args);
}
return null;
}
public void checkSecurity()
{
System.out.println("--------ServiceManagerImpl.checkSecurity()----------");
}
}
输出结果
--------ServiceManagerImpl.checkSecurity()----------
This is a method invoking before the method that was intercepted.
I am method outPut
This is a method invoking after the method that was intercepted.
--------ServiceManagerImpl.checkSecurity()----------
I am method putOut
跟预期效果一致,
使用这种方式维护起来相对比较好,我想进行安全性检查就进行,不想就不进行,很方便。
分享到:
相关推荐
在深入理解`spring-cglib-repack-3.2.4.jar`和`spring-objenesis-repack-2.5.1.jar`这两个jar包之前,我们先来了解一下Spring框架的核心概念。 Spring框架的核心包括依赖注入(Dependency Injection,DI)和面向切...
总的来说,`spring-cglib-repack-3.2.0.jar`和`spring-objenesis-repack-2.1.jar`是Spring框架正常运行的关键组成部分,它们分别负责动态子类生成和无参构造函数对象的快速实例化,对于理解和优化Spring应用的性能有...
"spring-objenesis-repack-2.6.jar"和"spring-objenesis-repack-2.5.1.jar"是Spring对Objenesis的不同版本,它们用于支持Spring框架中的某些特定功能,如Spring的测试框架或者AOP代理的创建。 在阅读Spring源码时,...
在提供的文件中,我们看到了两个与Spring相关的库:`spring-cglib-repack-3.2.6.jar` 和 `spring-objenesis-repack-2.6.jar`。这两个库都是Spring框架的重要组成部分,用于解决特定的编程问题。 首先,让我们来了解...
标题中的"spring-cglib-repack-3.2.5.jar"和"spring-objenesis-repack-2.6.jar"是两个与Spring框架相关的库文件,它们主要用于Spring框架的内部实现,尤其是针对Java对象的创建和代理机制。下面将详细解释这两个库的...
总之,"spring-cglib-repack-3.1.jar"和"spring-objenesis-repack-2.1.jar"是Spring 4.0框架的重要组成部分,它们分别提供了动态子类生成和快速对象实例化的能力,对于理解Spring的内部机制,尤其是AOP和对象生命...
总之,`spring-cglib-repack-3.2.4.jar`和`spring-objenesis-repack-2.4.jar`在Spring框架中扮演着核心角色,主要负责AOP代理和复杂对象的实例化。了解这些库的作用和使用方法,有助于更好地理解和优化Spring应用。
标题中的"spring-cglib-repack-3.2.5.jar"和"spring-objenesis-repack-2.6.jar"是Spring框架在运行时依赖的两个关键库,它们主要涉及到动态代理和对象创建的优化。 1. **CGLIB(Code Generation Library)**: ...
总结,"spring-cglib-repack-3.2.5.jar" 和 "spring-objenesis-repack-2.5.1.jar" 是Spring框架中的重要组件,它们分别负责动态代理和无参实例化。了解这两个库的工作原理以及如何根据源码生成jar包,对于深入理解和...
总之,spring-cglib-repack-3.2.0.jar和spring-objenesis-repack-2.2.jar是Spring源码编译的关键组成部分,它们为Spring的AOP代理功能提供了底层支持,特别是对于没有实现接口的类。正确地包含这些库可以确保顺利...
总的来说,`spring-cglib-repack-3.2.6.jar` 和 `spring-objenesis-repack-2.6.jar`是Spring框架的核心组成部分,它们提供了代理和对象实例化的底层支持。在进行Spring源码学习或开发时,确保这两个库的正确引入是至...
在Spring框架中,`spring-cglib-repack-3.2.6.jar`和`spring-objenesis-repack-2.6.jar`是两个重要的依赖库,它们在Spring源码环境中扮演着不可或缺的角色。本文将详细介绍这两个库以及它们在Spring框架中的作用。 ...
在Spring框架4.*版本中,可能会遇到一个常见问题,即缺少`spring-cglib-repack-3.2.5.jar`和`spring-objenesis-repack-2.6.jar`这两个jar文件。这两个文件是Spring框架运行时的重要依赖,它们涉及到Spring的动态代理...
总结来说,`spring-objenesis-repack-2.1.jar`和`spring-cglib-repack-3.1.jar`在Spring 4框架中起着至关重要的作用,它们提供了动态对象生成的能力,以支持Spring的AOP和依赖注入等核心功能。而`spring-core-4.1.3....
4. **spring-mvc-3.1.xsd**: Spring MVC 是 Spring 框架的一部分,专门用于构建 Web 应用的模型-视图-控制器架构。`spring-mvc-3.1.xsd` 文件定义了与 MVC 相关的配置元素,如控制器(Controller)、视图解析器...
在IT领域,Spring框架是一个广泛使用的Java应用框架,它提供了许多...在实际项目中,结合aopalliance.jar、spring-aop-4.1.6.RELEASE.jar和spring-aspects-4.1.6.RELEASE.jar,我们可以构建出高效且易于管理的系统。
在Spring Flex 1.5.0.M2中,核心组件`spring-flex-1.5.0.M2.jar`扮演了关键角色,它是Spring和Flex集成的核心库,提供了诸如消息代理、配置支持和Spring服务代理等功能。这个库使得Flex客户端可以轻松地调用Spring...
《Spring框架中的beans配置文件详解——以spring-beans-3.0.xsd和3.1.xsd为例》 在Spring框架中,`spring-beans`是核心组件之一,它负责管理对象的生命周期和依赖关系。`spring-beans`的配置文件通常以`.xsd`为后缀...
spring-aop-4.1.6.RELEASE.jar spring-aspects-4.1.6.RELEASE.jar spring-beans-4.1.6.RELEASE.jar spring-context-4.1.6.RELEASE.jar spring-context-support-4.1.6.RELEASE.jar spring-core-4.1.6.RELEASE.jar ...
总的来说,"spring-cglib-repack-3.2.0.jar"和"spring-objenesis-2.2.jar"是Spring框架的重要组成部分,它们在源码构建、AOP代理以及测试场景下扮演着不可或缺的角色。理解并掌握这些工具和库的使用,对于深入学习和...