一:Spring中的AOP技术实际上就是Struts2中的拦截器,只不过针对的对象不同,
Spring中的AOP技术: 拦截业务层的方法
Struts2中的拦截器: 拦截Action中的请求
二:示例:模拟一个业务需求
//service层
package com.spring.chapter6.service;
public interface UserService {
public void create();
public void update();
public void delete();
}
//service.impl实现类
package com.spring.chapter6.service.impl;
import com.spring.chapter6.service.UserService;
public class UserServiceImpl implements UserService {
private String user;
public UserServiceImpl() {
super();
}
public UserServiceImpl(String user) {
super();
this.user = user;
}
public void create() {
System.out.println("create方法被调用");
}
public void delete() {
System.out.println("delete方法被调用");
}
public void update() {
System.out.println("update方法被调用");
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
}
(1).可以看到服务层实现类中有一个持有User对象,我们现在的要求是如果用户为null,则没有权限调用create,update,delete这些方法,如果不为空则可以调用.
(2). 在Java中, JDK已经内置实现这种模式的一种机制—代理.
(3). ( java.lang.reflect.Proxy)类:
Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。
(4). 动态代理类(以下简称为代理类)是一个实现在创建类时在运行时指定的接口列表的类,该类具有下面描述的行为。
代理接口:是代理类实现的一个接口。 InvocationHandler
代理实例:是代理类的一个实例。 实现了InvocationHandler接口的类
(5). 使用JDK的AOP进行拦截方法, API上面说的非常清楚,代理对象必须实现一个接口
(6).public interface InvocationHandler
InvocationHandler 是代理实例的调用处理程序 实现的接口。 此接口中提供一个方法Invoke.
(7).Invoke方法简单理解:
当你获取到了代理对象(代理对象和原始对象一样,实现了共同的接口)以后,在代理对象上调用接口中暴露的方法,这个时候就会先调用Invoke方法,然后再调用原始类中的实际方法.
//JDKProxyFactory:
package com.spring.chapter6.service.impl;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKProxyFactory implements InvocationHandler {
private Object targetObj;
public Object getInstance(Object targetObj) {
this.targetObj = targetObj;
return Proxy.newProxyInstance(targetObj.getClass().getClassLoader(),
targetObj.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
UserServiceImpl userServiceImpl = (UserServiceImpl)targetObj;
if(userServiceImpl.getUser() != null){
return method.invoke(targetObj, args);
}
return null;
}
}
//测试类
package com.spring.chapter6.service.impl;
import com.spring.chapter6.service.UserService;
public class Test {
public static void main(String[] args) {
JDKProxyFactory factory = new JDKProxyFactory();
UserService userService = (UserService) factory
.getInstance(new UserServiceImpl("xiaozhang"));
userService.create();
}
}
分享到:
相关推荐
"jdk6(1.6.0_45)"是JDK的第6个主要版本的一个更新,具体为1.6.0的第45次更新。这个版本在2013年发布,它包含了Java编程语言的编译器、Java虚拟机(JVM)、类库以及开发者工具,如Java调试器和性能分析工具。 JDK 6...
6. **JEP 320:移除Java EE和Corba模块**:为了简化JDK,JDK 11移除了与Java EE和Corba相关的模块,这些技术已经被现代开发实践所取代。 7. **JEP 318:低内存运行时模式**:引入了一个名为“compact strings”的低...
JDK 6u45是JDK 6的第45个更新版本,包含了众多的性能优化、稳定性和安全性改进。这个版本对于开发者来说,提供了更稳定的开发环境,同时对应用程序的性能进行了提升,使得Java程序在运行时更加高效。 二、Windows x...
这次分享的是JDK 1.6.0源代码的第二部分,虽然不完整,但依然能让我们深入理解其内部工作原理。 **1. 类加载机制** Java的类加载机制是通过类加载器完成的,包括启动类加载器(Bootstrap ClassLoader)、扩展类加载...
JDK 1.6,也称为Java SE 6,是Java平台标准版的第六个主要版本。这个版本在2006年发布,引入了许多新特性和改进,包括: 1. **增强的Swing组件**:JDK 1.6对Swing UI库进行了大量优化,提高了性能,并添加了新的...
JDK1.6,全称为Java Development Kit的第6个更新版本(Update 45),是Oracle公司提供的用于开发和运行Java应用程序的重要工具集。这个版本是专为32位Windows操作系统设计的,确保了在该平台上对Java应用程序的兼容...
3. **第六章_cache-demo.zip**:此示例可能进一步扩展了缓存相关的实现,包括不同类型的缓存策略、缓存更新和过期策略等。 4. **第二章_execution-demo.zip**:这个代码可能演示了如何通过`@Around`通知和`@...
在这个项目中,重点是关于Java Development Kit(JDK)的第六个主要版本,即JDK 6。JDK是Oracle公司提供的一个包含Java编程语言和Java平台标准版(Java SE)核心组件的软件开发工具包。JDK 6在2006年发布,它引入了...
1. **代理模式 (12第十二讲:代理模式.7z)** 代理模式是一种结构型设计模式,它为一个对象提供一个代理以控制对该对象的访问。在Java中,代理模式可以用来实现动态代理,例如Spring AOP(面向切面编程)就是基于此...
14 使用正则表达式验证电话号码的格式 第6章 Java异常处理 6. 1 throw. throws. try和catch 6. 2 自定义异常类 6. 3 使用finally 6. 4 使用异常的技巧与原则 第7章 IO——输入输出流 7...
1. 改进的动态代理:在JDK 1.6中,Java的动态代理得到了增强,可以更方便地创建代理类,这对于实现AOP(面向切面编程)和其他设计模式提供了便利。 2. 新的Swing组件和改进:此版本增加了新的Swing组件,如...
"6u45"表示这是JDK 6的第45个更新版本,通常这些更新会修复已知问题、提升性能并增加新特性。 描述中的信息看似重复,可能是因为输入错误,但我们可以理解为该压缩包包含的是JDK 6u45针对Windows i586(即32位)...
4. **11.0.6_10**: 这是版本号,表示OpenJDK 11的第6次更新(Update 10)。每个更新通常会修复已知问题、提高性能和安全性,并可能包含新的功能。 5. **Linux**: 这个版本的OpenJDK是为Linux操作系统设计的,Linux...
4. **动态代理**:通过`java.lang.reflect.Proxy`类,开发者可以创建动态实现接口的代理对象,用于实现AOP(面向切面编程)和其他设计模式。 5. **改进的并发库**:JDK1.6提供了更强大的并发工具,如`java.util....
在这个第五部分的中文帮助文档中,我们将深入探讨一些关键知识点,帮助开发者更好地理解和利用JDK1.6的功能。 1. **增强的泛型支持** JDK1.6在泛型方面进行了加强,提供了更丰富的类型推断和泛型通配符,使得代码...
本文主要介绍四种常见的设计模式:单例模式、工厂模式、观察者模式和代理模式,以及JDK提供的动态代理模式。 **知识点1:单例模式** 单例模式是一种限制类实例化次数的设计模式,确保一个类只有一个实例,并提供...
《Professional Java Jdk 6 part2》是一本深入解析Java JDK 6的专著,而提供的"Code.rar"压缩包则是该书籍第二部分的源代码资源。这些源代码旨在帮助读者更好地理解和实践书中所讲解的Java编程技术。下面将详细讨论...
8. **代理模式(Proxy)**:再次提及,因为它是结构模式中非常重要的一种,它可以分为静态代理和动态代理,动态代理如Java中的JDK Proxy和CGLIB。 以上这些模式在实际开发中有着广泛的应用,如在框架设计、分布式...
3. **动态代理**:通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口,开发者可以创建动态代理对象,实现代理模式和AOP(面向切面编程)的功能。 4. **NIO.2**:引入了`java.nio.file`...