The proxy mode of the first part of spring-aop-static proxy

代理对象(proxy)    增强后的对象
目标对象(target)   被增强的对象
1.静态代理(继承和聚合)
  继承:代理对象继承目标对象,重写需要增强的方法;缺点:会代理类过多,非常复杂
  聚合:目标对象和代理对象实现同一个接口,代理对象当中要包含目标对象。缺点:也会产生类爆炸,只不过比            
        继承少一点点
总结:如果在不确定的情况下,尽量不要去使用静态代理。因为一旦你写代码,就会产生类,一旦产生类就爆炸。

2.动态代理(jdk和cglib)
  JDK动态代理:
  cglib动态代理:

Static proxy-inheritance (eg: add log before the original function, permission function) (according to the order of different target objects and proxy objects are also different)

public class UserDao {
	
	public void queryAll() {
		System.out.println("=== query -> db ->  queryAll  ===");
		//1 改代码 添加日志业务逻辑  添加 权限业务逻辑
	}
}

test

public class Test {
	public static void main(String[] args) {
		UserDao dao = new UserDao();
		dao.queryAll();
		//2 改代码 添加日志业务逻辑  添加 权限业务逻辑
	}
}

In order not to destroy the encapsulation of the class, use proxy technology to extend the function

Extended log function

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  ===

In the same way, extend the permission function like this

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  ===

If you need two together, although the grammar does not support multiple inheritance, we can chain inheritance

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  ===

You can find that you have to create a new class every time

Static proxy-aggregation (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  ===

Extended function log

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  ===

Same permissions

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  ===

Extended log and permission functions

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  ===

Similarly, if there are always different new functions that need to be extended, we can only continue to create new interfaces to proxy implementations

Part II-Dynamic Agent

Guess you like

Origin blog.csdn.net/qq_38108719/article/details/99848802