Spring署理对象的原理
package com.dao;
import org.springframework.stereotype.Component;
import com.model.User;
@Component("userDao")
public class UserDaoImpl implements UserDao {
public void save(User user) {
//Hibernate
//JDBC
//XML
//NetWork
System.out.println(" user save !");
}
public void delete(User user) {
System.out.println(" delete save !");
}
}
日志拦截类:
package com.spring;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//需要实现InvocationHandler接口
public class LogInterceptor implements InvocationHandler {
//被代理对象
private Object target;
public void beforeMethod(Method m) {
System.out.println(m.getName()+" start logger!!!!!");
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
this.beforeMethod(method);
method.invoke(target, args);
return null;
}
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
}
测试类:
package com.test;
import java.lang.reflect.Proxy;
import com.dao.UserDao;
import com.dao.UserDaoImpl;
import com.model.User;
import com.spring.LogInterceptor;
public class InterceptorTest {
public static void main(String[] args) {
UserDao userDao = new UserDaoImpl();
LogInterceptor log = new LogInterceptor();
log.setTarget(userDao);
UserDao userDaoProxy = (UserDao)Proxy.newProxyInstance(UserDao.class.getClassLoader(), new Class[]{UserDao.class}, log);
System.out.println(userDaoProxy.getClass());
userDaoProxy.save(new User());
userDaoProxy.delete(new User());
}
}