Spring之静态代理、动态代理(实现动态代理的两种方式)与AOP底层实现动态代理(两种方式)
2-1代理
2.1.1 静态代理
- 抽象角色:一般是接口或者抽象类
- 真实角色:也就是目标对象 被代理的角色
- 代理角色:代理目标对象 除了实现目标对象中的功能外 还可以额外扩展其它功能
- 客户角色:使用代理角色完成其需要执行的功能
静态代理的好处:
- 可以使我们的目标对象(真实角色)功能更加纯粹 不需要关注于其它事务
- 公共的业务由代理来完成 实现了业务的分工
- 公共业务需要扩展时更加方便 减少了代码的冗余性
2.1.2 静态代理的实现
2.1.2.1 抽象角色
UserDao接口
public interface UserDao {
void add();
void delete();
void update();
void query();
}
2.1.2.2 目标对象(真实角色)
UserDaoImpl.java
package com.zelin.dao.impl;
import com.zelin.dao.UserDao;
/**
* @author wf
* @date 2020-10-20 16:06
*/
public class UserDaoImpl implements UserDao {
@Override
public void add() {
System.out.println("UserDao----->>>>执行了add()方法");
}
@Override
public void delete() {
System.out.println("UserDao----->>>>执行了delete()方法");
}
@Override
public void update() {
System.out.println("UserDao----->>>>执行了update()方法");
}
@Override
public void query() {
System.out.println("UserDao----->>>>执行了query()方法");
}
}
2.1.2.3 代理角色
ProxyStatic.java
package com.zelin.proxy;
import com.zelin.dao.UserDao;
import com.zelin.dao.impl.UserDaoImpl;
/**
* @author wf
* @date 2020-10-20 16:08
*/
public class ProxyStatic implements UserDao {
private UserDao userDao;
public ProxyStatic(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void add() {
userDao.add();
}
@Override
public void delete() {
userDao.delete();
}
@Override
public void update() {
userDao.update();
}
@Override
public void query() {
safe();
userDao.query();
}
//自定义方法 检查安全性
private void safe(){
System.out.println("我正在检查安全性.....");
}
}
2.1.2.3 测试类进行测试
TestProxy.java
package com.zelin.test;
import com.zelin.dao.UserDao;
import com.zelin.dao.impl.UserDaoImpl;
import com.zelin.proxy.ProxyStatic;
import org.junit.Before;
import org.junit.Test;
/**
* @author wf
* @date 2020-10-20 16:10
*/
public class TestProxy {
private ProxyStatic proxyJDKStatic;
private UserDao userDao;
@Before
public void init(){
userDao = new UserDaoImpl();
proxyJDKStatic = new ProxyStatic(userDao);
}
@Test
public void test01(){
proxyJDKStatic.add();
System.out.println("================");
proxyJDKStatic.query();
}
}
实现结果
UserDao----->>>>执行了add()方法
================
我正在检查安全性.....
UserDao