静态代理
只能给IUserDao类代理,换成其他的不能代理
interface IUserDao.class
public interface IUserDao {
public void save();
}
UserDaoImp.class
public class UserDaoImp implements IUserDao{
@Override
public void save() {
System.out.println("----------存储-------");
}
}
Proxy_UserDao.class
public class Proxy_UserDao implements IUserDao {
private IUserDao iUserDao;
public Proxy_UserDao(IUserDao iUserDao) {
this.iUserDao = iUserDao;
}
@Override
public void save() {
System.out.println("--------开启事务---------");
iUserDao.save();
System.out.println("----------关闭事务----------");
}
}
Main.class
public static void main( String[] args )
{
IUserDao iUserDao = new UserDaoImp();
Proxy_UserDao proxy_userDao = new Proxy_UserDao(iUserDao);
proxy_userDao.save();
}
动态代理
IUserDao.class
public interface IUserDao {
void save();
}
UserDao.class
public class UserDao implements IUserDao {
@Override
public void save() {
System.out.println("------------储存------------");
}
}
ProxyFactory.class
public class ProxyFactory {
private Object target;
public ProxyFactory(Object target) {
this.target = target;
}
public Object getInstance(){
//生产代理对象过程
Object instance = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("------------开启事务-----------");
Object instance = method.invoke(target, args);
System.out.println("------------关闭事务------------------");
return instance;
}
});
return instance;
}
}
Main.class
public class Main {
public static void main(String[] args) {
IUserDao target = new UserDao();
System.out.println(target.getClass());
IUserDao proxy = (IUserDao) new ProxyFactory(target).getInstance();
System.out.println(proxy.getClass());
proxy.save();
}
}
静态代理:非常局限,只能给特定的(自己定义的)接口的实现类代理
动态代理:比较灵活,可以给具有接口的类代理
AOP:灵活,可以给任意有接口或无接口的类代理