Spring AOP的简单例子
一个使用Spring AOP的简单例子
有一个UserLogger类,用于记录user信息:
public class UserLogger {
private String userName = "";
public void setUserName(String i) {
this.userName = i;
}
//记录用户信息
public void log() {
System.out.println("记录用户:" + this.userName);
}
}
在定义拦截器advicer,用于用户校验:
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class SecurityAdvice implements MethodBeforeAdvice {
private SecurityManager securityManager;
public SecurityAdvice() {
this.securityManager = new SecurityManager();
}
public void before(Method method, Object[] args, Object target) throws Throwable {
if(method.getName().equals("log")){
securityManager.check();
}
}
}
接着定义校验管理类:
public class SecurityManager {
//定义成ThreadLocal,因为SecurityAdvice中也new了SecurityManager
//可以把SecurityManager定义成singleton的就可以替代
private static ThreadLocal userName = new ThreadLocal();
private String password;
public void login(String name, String password){
userName.set(name);
this.password = password;
}
public void check() {
String u = (String)userName.get();
if (u == null) {
System.out.println("没有用户");
} else if ("KENT".equals(u)) {
System.out.println("Kent登陆成功");
} else {
System.out.println("用户:" + u + "没有权限");
}
}
}
最后是测试代码:
import org.springframework.aop.framework.ProxyFactory;
public class TestAOP {
public static void main(String[] args) {
SecurityManager manager = new SecurityManager();
//设置ProxyFactory的advice(aop方式),target(需要被aop调用的对象。)
UserLogger target = new UserLogger();
SecurityAdvice advice = new SecurityAdvice();
ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.setTarget(target);
proxyFactory.addAdvice(advice);
UserLogger bean = (UserLogger) proxyFactory.getProxy();
String userName = "KENT";
String password = "";
manager.login(userName, password);//保存了用户信息,未执行check方法
bean.setUserName(userName);
bean.log();//自动执行check()方法,AOP调用成功
userName = "TOM";
manager.login(userName, password);
bean.setUserName(userName);
bean.log();
}
}
上面完成了如下功能:用户登陆,打印Log信息,在打印Log信息前使用AOP进行用户校验
一个使用Spring AOP的简单例子
有一个UserLogger类,用于记录user信息:
public class UserLogger {
private String userName = "";
public void setUserName(String i) {
this.userName = i;
}
//记录用户信息
public void log() {
System.out.println("记录用户:" + this.userName);
}
}
在定义拦截器advicer,用于用户校验:
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class SecurityAdvice implements MethodBeforeAdvice {
private SecurityManager securityManager;
public SecurityAdvice() {
this.securityManager = new SecurityManager();
}
public void before(Method method, Object[] args, Object target) throws Throwable {
if(method.getName().equals("log")){
securityManager.check();
}
}
}
接着定义校验管理类:
public class SecurityManager {
//定义成ThreadLocal,因为SecurityAdvice中也new了SecurityManager
//可以把SecurityManager定义成singleton的就可以替代
private static ThreadLocal userName = new ThreadLocal();
private String password;
public void login(String name, String password){
userName.set(name);
this.password = password;
}
public void check() {
String u = (String)userName.get();
if (u == null) {
System.out.println("没有用户");
} else if ("KENT".equals(u)) {
System.out.println("Kent登陆成功");
} else {
System.out.println("用户:" + u + "没有权限");
}
}
}
最后是测试代码:
import org.springframework.aop.framework.ProxyFactory;
public class TestAOP {
public static void main(String[] args) {
SecurityManager manager = new SecurityManager();
//设置ProxyFactory的advice(aop方式),target(需要被aop调用的对象。)
UserLogger target = new UserLogger();
SecurityAdvice advice = new SecurityAdvice();
ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.setTarget(target);
proxyFactory.addAdvice(advice);
UserLogger bean = (UserLogger) proxyFactory.getProxy();
String userName = "KENT";
String password = "";
manager.login(userName, password);//保存了用户信息,未执行check方法
bean.setUserName(userName);
bean.log();//自动执行check()方法,AOP调用成功
userName = "TOM";
manager.login(userName, password);
bean.setUserName(userName);
bean.log();
}
}
上面完成了如下功能:用户登陆,打印Log信息,在打印Log信息前使用AOP进行用户校验