问题:我们有一个实现类,分别有添加、删除、更新、查询等方法,如果我们现在要在执行方法加一个验证权限的方法,我们该如何做呢?有人会这还不简单,新建一个方法,在每个方法前调用一个就行。这种是可以完成功能,但它不够灵活,也破坏了我们的原有的代码。那该如何做才能更灵活呢?我们现在用jdk提供的动态代理模式来实现。
首先,我们新建一个接口UserManager
public interface UserManager {
public void addUser(String username, String password);
public void deleteUser(int id);
public void modifyUser(int id, String username, String password);
public String findUserById(int id);
}
然后,在写一个实现类实现这个接口UserManagerImpl.java
public class UserManagerImpl implements UserManager {
public void addUser(String username, String password) {
System.out.println("----UserManagerImpl.addUser()--------");
}
public void deleteUser(int id) {
System.out.println("------UserManagerImpl.deleteUser()-------");
}
public String findUserById(int id) {
System.out.println("----UserManagerImpl.findUserById()------");
return null;
}
public void modifyUser(int id, String username, String password) {
System.out.println("-------UserManagerImpl.modifyUser()------");
}
}
其次,写一个代理类SecurityHandler,生成我们实现类的代理类,我们将在这个加上验证权限的方法。
public class SecurityHandler implements InvocationHandler {
private Object targetObject;
public Object newProxy(Object targetObject) {
this.targetObject = targetObject;
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
checkSecurity();
Object ret = null;
try {
ret = method.invoke(this.targetObject, args);
}catch(Exception e) {
e.printStackTrace();
throw new java.lang.RuntimeException(e);
}
return ret;
}
private void checkSecurity() {
System.out.println("----------checkSecurity()------------");
}
}
最后,我们写一个测试类来进行测试一下。
public class Client {
public static void main(String[] args) {
SecurityHandler handler = new SecurityHandler();
UserManager userManager =
(UserManager)handler.newProxy(new UserManagerImpl());
userManager.deleteUser(1);
}
}
分享到:
相关推荐
Spring框架通过AOP代理实现了这一功能,使得开发者可以在不修改业务逻辑代码的情况下添加新的行为。 - **通知类型**: - **前置通知**:在方法执行前调用。 - **后置通知**:在方法执行后调用,无论是否抛出异常...
Zuul 是一个边缘服务应用,为微服务架构集群提供代理、过滤、路由等功能。 6. **Feign**:声明式HTTP客户端。Feign 是一个声明式的 HTTP 客户端,使得编写 Web 服务客户端更加容易。 #### 构建Spring Cloud项目的...
7. Spring AOP:尽管文档主要是围绕JDK动态代理展开的,但文档还提及了Spring AOP框架,这是一个更为高级和流行的AOP实现。Spring AOP同样基于代理模式,但支持在方法调用前后加入额外的行为(advice),且能够与...
- `lib/cglib/cglib-nodep-2.1_3.jar`,提供动态代理实现。 - 当项目中涉及到JSR-250标准注解(如@Resource, @PostConstruct, @PreDestroy)时,必须包含: - `lib\j2ee\common-annotations.jar` 确保将上述所有...
这个名为“spring整理好的jar包.zip”的压缩文件包含了Spring框架中几个关键领域的核心组件,旨在简化开发过程并提升效率。让我们逐一深入理解这些组件及其在实际应用中的作用。 首先,我们来看“ioc专用包”。IOC...
4. **AOP(面向切面编程)**:通过代理模式实现了切面编程,帮助开发者实现诸如日志记录、安全控制等功能。 5. **工具**:提供了各种工具类,如用于文件上传的CommonsMultipartResolver。 6. **消息**:支持多种...
《Simple-Spring-Memcached统一缓存的使用详解》 在Java应用中,尤其是在中大型项目中,有效地管理和使用缓存对于提升系统性能至关重要。Simple-Spring-Memcached(SSM)是一个流行的缓存框架,它整合了Spring框架...
- Spring支持两种类型的AOP:基于代理的(包括JDK动态代理和CGLIB代理)和基于AspectJ的AOP。 5. **Spring MVC** - Spring MVC是Spring框架的一个模块,用于构建Web应用程序。 - 它采用Model-View-Controller...
AOP 在 Spring.NET 中主要通过代理模式实现,可以用于事务管理、日志记录、性能度量等场景。 总之,Spring.NET 是一个强大的 .NET 开发框架,通过 IoC 和 AOP 提供了灵活的应用程序结构和模块化设计,使开发者能够...
这个“Spring面试专题及答案整理文档”包含了Spring框架的重要知识点,是准备Spring面试和深入理解Spring技术体系的良好资料。 1. **依赖注入(DI)** - DI是Spring的核心,它允许开发者在运行时通过XML配置或注解...
- **AOP代理**:Spring支持JDK动态代理和CGLIB代理,通过ProxyFactoryBean和Advised接口实现,源码中可深入了解这些技术。 在分析源码的过程中,不仅需要理解代码逻辑,还要结合设计模式,如工厂模式、装饰器模式、...
- **动态SQL**:如何利用MyBatis的动态SQL来编写灵活的查询语句。 - **缓存机制**:一级缓存和二级缓存的理解和使用场景。 - **Mapper接口与XML配置**:接口映射和XML配置文件的结合使用。 5. **Dubbo面试**: ...
### Spring知识整理 #### 一、Spring框架简介与环境搭建 **Spring** 是一款轻量级的 Java 开发框架,其核心设计目标是为了使企业应用更容易配置和部署,同时简化了开发过程。Spring 可以集成几乎所有的 J2EE 流行...
在学习Spring Cloud的过程中,可以按照以下几个方面进行系统性的整理和笔记记录: 1. **基础概念和架构**: - 了解微服务架构的基本概念和Spring Cloud的核心组件,如Eureka、Ribbon、Feign、Hystrix、Zuul、...
这份"java-java面试题库整理-基础-JVM-线程并发-框架等.zip"文件提供了一个全面的复习资源,帮助求职者准备Java相关的面试。 1. **Java基础知识** - 类与对象:Java是一种面向对象的语言,了解类的定义、构造器、...
在Spring中,AOP主要通过代理模式实现,分为JDK动态代理和CGLIB代理两种。`org.springframework.aop`和`org.springframework.aop.framework`包下的类,如`Advised`、`Advisor`、`Pointcut`和`ProxyFactoryBean`,...
本源码电子书聚焦于Spring Core的源码解析,它是由Spring Core源码整理而来的,内容上呈现了Spring核心模块源码的细节和工作机制。通过阅读源码,开发者可以更深入地理解Spring框架的设计思想和实现细节,从而在实际...
SpringBlade致力于创造新颖的开发模式,整理归纳开发中遇到的痛点和生产中的坑,并将解决方案融合到框架中。Sword是SpringBlade前端UI框架,主要技术选型为React、Ant Design、Umi、Dva。Saber核心框架项目地址,...
“知识点总结.xls”可能是一个整理好的Spring框架关键知识点的表格,可能包含了Spring的主要模块(如Core Container、Data Access/Integration、Web、AOP、Test等)、关键概念(如Bean、ApplicationContext、IoC容器...
Spring AOP 中的动态代理主要有两种方式:JDK 动态代理和 CGLIB 动态代理。JDK 动态代理只提供接口的代理,不支持类的代理,要求被代理类实现接口。JDK 动态代理的核心是 InvocationHandler 接口和 Proxy 类,在...