UserDao类:
package com.sunyan.dao;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class UserDao {
private Map map = new HashMap();
public UserDao(){
map.put("admin", "security");
map.put("test", "123");
}
public void create(String username, String password){
if(map.get(username)!=null)
throw new RuntimeException("User exist");
map.put(username, password);
}
public void login(String username,String password){
String pw = map.get(username);
if(pw==null||!pw.equals(password))
throw new RuntimeException("Login failed");
}
public void print(){
System.out.println("User list:");
Set keySet = (Set) map.keySet();
for(String key : keySet)
System.out.println(key);
}
}
UserService接口:
package com.sunyan.service;
public interface UserService {
void create(String username,String password);
void login(String username,String password);
}
UserServiceImpl类:
package com.sunyan.service.impl;
import com.sunyan.dao.UserDao;
import com.sunyan.service.UserService;
public class UserServiceImpl implements UserService{
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void create(String username, String password) {
userDao.create(username, password);
}
@Override
public void login(String username, String password) {
userDao.login(username, password);
}
}
AopProxyFactory类:
package com.sunyan.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.springframework.aop.MethodBeforeAdvice;
public class AopProxyFactory {
public static Object createProxy(final Object target,final MethodBeforeAdvice methodBeforeAdvice) {
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method,Object[] args) throws Throwable {
//首先调用切面的before方法
methodBeforeAdvice.before(method, args, target);
//然后调用实际对象的方法
return method.invoke(target, args);
}
});
}
}
测试类:
package com.sunyan.test;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.framework.ProxyFactory;
import com.sunyan.dao.UserDao;
import com.sunyan.proxy.AopProxyFactory;
import com.sunyan.service.UserService;
import com.sunyan.service.impl.UserServiceImpl;
public class DynamicProxyTest {
public static void main(String[] args) {
UserDao userDao = new UserDao();
UserServiceImpl target = new UserServiceImpl();
target.setUserDao(userDao);
//创建日志记录切面
MethodBeforeAdvice log = new MethodBeforeAdvice(){
@Override
public void before(Method m, Object[] args, Object target)
throws Throwable {
System.out.println("call method: "+ m.getName());
}
};
/*//创建代理类
UserService userService = (UserService) AopProxyFactory.createProxy(target, log);
//调用代理类的方法
userService.create("aop", "password");
userService.login("aop", "password");
userDao.print();*/
//我想使用的是Spring的ProxyFactory类,可是addInterceptor方法报错,说没有此方法。
ProxyFactory factory = new ProxyFactory(target);
factory.addInterceptor(log);
UserService userService = (UserService) factory.getProxy();
userService.create("aop", "password");
userService.login("aop", "password");
userDao.print();
}
}
在测试类中的:factory.addInterceptor(log);出错,报说没有此方法,为什么?