一: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();
}
}