代理对象(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