代理对象(proxy) 增强后的对象
目标对象(target) 被增强的对象
1.静态代理(继承和聚合)
继承:代理对象继承目标对象,重写需要增强的方法;缺点:会代理类过多,非常复杂
聚合:目标对象和代理对象实现同一个接口,代理对象当中要包含目标对象。缺点:也会产生类爆炸,只不过比
继承少一点点
总结:如果在不确定的情况下,尽量不要去使用静态代理。因为一旦你写代码,就会产生类,一旦产生类就爆炸。
2.动态代理(jdk和cglib)
JDK动态代理:
cglib动态代理:
Herança de proxy estática (por exemplo: adicionar log antes da função original, função de permissão) (de acordo com a ordem dos diferentes objetos de destino e os objetos de proxy também são diferentes)
public class UserDao {
public void queryAll() {
System.out.println("=== query -> db -> queryAll ===");
//1 改代码 添加日志业务逻辑 添加 权限业务逻辑
}
}
teste
public class Test {
public static void main(String[] args) {
UserDao dao = new UserDao();
dao.queryAll();
//2 改代码 添加日志业务逻辑 添加 权限业务逻辑
}
}
Para não destruir o encapsulamento da classe, use a tecnologia de proxy para estender a função
Função de registro estendida
public class LogUserDao extends UserDao{
@Override
public void queryAll() {
System.out.println("=== query -> db -> queryAll log===");
super.queryAll();
}
}
public class Test {
public static void main(String[] args) {
UserDao dao = new LogUserDao();
dao.queryAll();
}
}
控制台打印实现了日志功能
=== query -> db -> queryAll log===
=== query -> db -> queryAll ===
Da mesma forma, estenda a função de permissão desta forma
public class PermissionUserDao extends UserDao{
@Override
public void queryAll() {
System.out.println("=== query -> db -> queryAll Permission===");
super.queryAll();
}
}
public class Test {
public static void main(String[] args) {
UserDao dao = new PermissionUserDao();
dao.queryAll();
}
}
控制台打印
=== query -> db -> queryAll Permission===
=== query -> db -> queryAll ===
Se você precisa de dois juntos, embora a gramática não suporte herança múltipla, podemos encadear a herança
public class LogAndPerUserDao extends LogUserDao{
@Override
public void queryAll() {
System.out.println("=== query -> db -> queryAll Permission ===");
//如果是继承LogUserDao 就写权限逻辑 具体看先后顺序
//如果是继承PermissionUserDao 就写日志逻辑
super.queryAll();
}
}
public class Test {
public static void main(String[] args) {
UserDao dao = new LogAndPerUserDao();
dao.queryAll();
}
}
控制台打印
=== query -> db -> queryAll Permission ===
=== query -> db -> queryAll log===
=== query -> db -> queryAll ===
Você pode descobrir que precisa criar uma nova classe toda vez
Agregação de proxy estática (interface)
public interface UserDao {
public void queryAll();
}
public class UserDaoImpl implements UserDao{
@Override
public void queryAll() {
System.out.println("=== query -> db -> queryAll ===");
}
}
public class Test {
public static void main(String[] args) {
UserDao userDao = new UserDaoImpl();
userDao.queryAll();
}
}
控制台打印
=== query -> db -> queryAll ===
Registro de função estendido
public class ProxyLogUserDaoImpl implements UserDao{
UserDao userDao;
public ProxyLogUserDaoImpl(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void queryAll() {
System.out.println("=== query -> db -> queryAll log===");
userDao.queryAll();
}
}
public class Test {
public static void main(String[] args) {
UserDao userDao = new UserDaoImpl();//目标对象
ProxyLogUserDaoImpl proxyLogUserDaoImpl = new ProxyLogUserDaoImpl(userDao);//代理对象
proxyLogUserDaoImpl.queryAll();
}
}
控制台打印
=== query -> db -> queryAll log===
=== query -> db -> queryAll ===
Mesmas permissões
public class ProxyPermissionUserDaoImpl implements UserDao{
UserDao userDao;
public ProxyPermissionUserDaoImpl(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void queryAll() {
System.out.println("=== query -> db -> queryAll Permission ===");
userDao.queryAll();
}
}
public class Test {
public static void main(String[] args) {
UserDao userDao = new UserDaoImpl();
//ProxyLogUserDaoImpl proxyLogUserDaoImpl = new ProxyLogUserDaoImpl(userDao);
//proxyLogUserDaoImpl.queryAll();
ProxyPermissionUserDaoImpl proxyPermissionUserDaoImpl = new ProxyPermissionUserDaoImpl(userDao);
proxyPermissionUserDaoImpl.queryAll();
}
}
控制台打印
=== query -> db -> queryAll Permission ===
=== query -> db -> queryAll ===
Funções estendidas de registro e permissão
public class Test {
public static void main(String[] args) {
UserDao userDao = new UserDaoImpl();
ProxyLogUserDaoImpl proxyLogUserDaoImpl = new ProxyLogUserDaoImpl(userDao);
ProxyPermissionUserDaoImpl proxyPermissionUserDaoImpl = new ProxyPermissionUserDaoImpl(proxyLogUserDaoImpl);
proxyPermissionUserDaoImpl.queryAll();
}
}
控制台打印
=== query -> db -> queryAll Permission ===
=== query -> db -> queryAll log===
=== query -> db -> queryAll ===
Da mesma forma, se sempre houver novas funções diferentes que precisam ser estendidas, só podemos continuar a criar novas interfaces para implementação de proxy
Parte II - Agente Dinâmico