代理模式分为静态代理和动态代理。静态代理就是我们自己定义的代理类,动态代理是程序在运行时生成的代理类。
下面演示下静态代理类。首先我们要定义一个接口:
package com.szy.spring;
public interface UserManager
{
public void addUser(String username,String password);
public void deleteUser(int userId);
public void modifyUser(int userId,String username,String password);
public void findUser(int userId);
}
比较常见的对用户进行增删改查。
下面我们常见一个实现类,实现这个接口。
package com.szy.spring;
public class UserManagerImpl implements UserManager
{
public void addUser(String username, String password)
{
System.out.println("--------UserManagerImpl.addUser()----------");
}
public void deleteUser(int userId)
{
System.out.println("--------UserManagerImpl.deleteUser()----------");
}
public void findUser(int userId)
{
System.out.println("--------UserManagerImpl.findUser()----------");
}
public void modifyUser(int userId, String username, String password)
{
System.out.println("--------UserManagerImpl.modifyUser()----------");
}
}
每个方法仅仅是输出一句话。
下面我们定义一个客户端类来调用这些方法。
package com.szy.spring;
public class Client
{
public static void main(String[] args)
{
UserManager userManager=new UserManagerImpl();
userManager.addUser("coolszy", "kuka");
}
}
运行正常输出我们期望的结果。
下面我们需要加入安全性检查,就是调用方法前我们需要进行验证,比较常见的就是权限验证,验证用户是否拥有权限,
比较常见的做法就是在UserManagerImpl类中定义一个检查安全性的方法:
public void checkSecurity()
{
System.out.println("--------UserManagerImpl.checkSecurity()----------");
}
然后在每个方法中都要调用这个方法。但是这样不符合开-闭原则(Open-Closed principle,简称OCP)。因此我们可以使用代理类来实现这个功能。代理模式很显著的特征就是和目标对象的接口一致。在代理类中我们可以控制目标对象。要控制目标对象我们必须有一个目标对象的引用。为了灵活我们可以把目标对象传到方法中,而不是在方法中实例化。同时我们把安全性检查的代码也放到代理类中,在调用每个方法之前调用这个检查方法,通过代理对我们以前的类没有破坏。
package com.szy.spring;
public class UserManagerImplProxy implements UserManager
{
private UserManager userManager;
public UserManagerImplProxy(UserManager userManager)
{
this.userManager = userManager;
}
public void addUser(String username, String password)
{
checkSecurity();
this.userManager.addUser(username, password);
}
public void deleteUser(int userId)
{
checkSecurity();
this.userManager.deleteUser(userId);
}
public String findUser(int userId)
{
checkSecurity();
return this.userManager.findUser(userId);
}
public void modifyUser(int userId, String username, String password)
{
checkSecurity();
this.userManager.modifyUser(userId, username, password);
}
public void checkSecurity()
{
System.out.println("--------UserManagerImpl.checkSecurity()----------");
}
}
下面修改客户端类。
UserManager userManager=new UserManagerImplProxy(new UserManagerImpl());
userManager.addUser("coolszy", "kuka");
这样总的来说比较灵活。这个依赖关系是我们自己做的,我们完全可以交给spring处理。
按照上面的这种做法有一个缺点,如果接口中方法很多,那么我们实现每一个方法都要添加检查方法checkSecurity(),影响了我们的业务处理。采用静态代理模式我们是没法解决的,这时我们需要使用AOP思想。
分享到:
相关推荐
云的学习笔记-云的学习笔记系统-云的学习笔记系统源码-云的学习笔记管理系统-云的学习笔记管理系统java代码-云的学习笔记系统设计与实现-基于ssm的云的学习笔记系统-基于Web的云的学习笔记系统设计与实现-云的学习...
**SpringDM笔记7-开发SpringDM Bundle** SpringDM(Spring Dynamic Modules)是Spring框架的一个扩展,专门用于OSGi(Open Service Gateway Initiative)环境中的应用程序开发。OSGi是一种Java模块化系统,它允许...
黑马程序员-SpringCloud-学习笔记01-认识微服务
云的学习笔记-云的学习笔记系统-云的学习笔记系统源码-云的学习笔记管理系统-云的学习笔记管理系统java代码-云的学习笔记系统设计与实现-基于ssm的云的学习笔记系统-基于Web的云的学习笔记系统设计与实现-云的学习...
黑马程序员-SpringCloud-学习笔记-03-Eureka注册中心
在本篇Spring学习笔记中,我们将深入探讨动态代理模式,并结合Spring框架的实现进行分析演示。动态代理模式是Java编程中一种重要的设计模式,它允许我们在不修改原对象代码的情况下,为对象添加额外的功能或行为。...
"spring-objenesis-repack-2.6.jar"和"spring-objenesis-repack-2.5.1.jar"是Spring对Objenesis的不同版本,它们用于支持Spring框架中的某些特定功能,如Spring的测试框架或者AOP代理的创建。 在阅读Spring源码时,...
在这个问题中,我们遇到了两个关键的jar包:`spring-cglib-repack-3.2.0.jar`和`spring-objenesis-repack-2.1.jar`。这两个jar包对于理解Spring框架的工作原理以及它们在实际应用中的作用至关重要。 首先,`spring-...
Java Spring代理模式AOP-IOC分析 一、代理模式概述 在软件设计中,代理模式是一种常用的设计模式。...本文对Java Spring代理模式AOP-IOC进行了分析和讨论,并提供了一个示例项目来演示如何使用Spring实现AOP和IOC。
黑马程序员-SpringCloud-学习笔记-02-微服务拆分及远程调用
在"SpringSecurity笔记2-SpringSecurity命名空间"的学习中,还会涉及到如何自定义过滤器链,以及如何通过`<custom-filter>`元素插入自定义的SpringSecurity过滤器。同时,理解`<access-denied-handler>`和`...
以上是 Spring 2.5.6 学习笔记中的关键知识点,通过这些基础知识的学习,开发者可以开始构建基于 Spring 框架的应用程序。接下来,可以进一步深入学习 Spring 的高级特性,如事务管理、安全性、Web 开发等方面的知识...
包含spring 3.0.5的所有jar文件: org.springframework.aop-3.0.5.RELEASE.jar org.springframework.asm-3.0.5.RELEASE.jar org.springframework.aspects-3.0.5.RELEASE.jar org.springframework.beans-3.0.5.RELEASE...
这份"Spring学习笔记+学习源码.zip"资源包含了深入学习Spring及其相关技术的知识点,以及实践代码,对提升Spring技能将大有裨益。 首先,我们来详细讨论Spring框架的主要组件和功能: 1. **依赖注入(Dependency ...