运用SpringAOP 相关知识,开发基于Cglib 动态代理的案例,要求:
1.使用Cglib动态代理:
2.定义接口UserManager 及实现类UserManagerImpl:
3.定义切面类MyAspect,在切面类中定义增强方法:检查权限(checkPermission)与记录日志(log):
4.定义代理类CglibProxy,实现MethodInterceptor 接口;
5.在代理类中实现对UserManager 中的所有方法进行增强。
好的,以下是基于Cglib动态代理的示例代码:
1. 使用Cglib动态代理
在pom.xml文件中添加Cglib依赖:
xml
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
2. 定义接口UserManager及实现类UserManagerImpl
public interface UserManager {
void addUser(String userName, String password);
void deleteUser(String userName);
void updateUser(String userName, String password);
String findUserByName(String userName);
}
public class UserManagerImpl implements UserManager {
private Map<String, String> users = new HashMap<>();
@Override
public void addUser(String userName, String password) {
System.out.println("添加用户:" + userName);
users.put(userName, password);
}
@Override
public void deleteUser(String userName) {
System.out.println("删除用户:" + userName);
users.remove(userName);
}
@Override
public void updateUser(String userName, String password) {
System.out.println("更新用户:" + userName);
users.put(userName, password);
}
@Override
public String findUserByName(String userName) {
System.out.println("查找用户:" + userName);
return users.get(userName);
}
}
3. 定义切面类MyAspect,在切面类中定义增强方法:检查权限(checkPermission)与记录日志(log)
public class MyAspect {
// 检查用户权限
public void checkPermission() {
String userName = SecurityContextHolder.getContext().getAuthentication().getName();
if (!"admin".equals(userName)) {
throw new SecurityException("无权限操作!");
}
}
// 记录日志
public void log() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(new Date()) + " 操作了用户管理功能");
}
}
4. 定义代理类CglibProxy,实现MethodInterceptor接口
public class CglibProxy implements MethodInterceptor {
private Object target; // 目标对象
private MyAspect aspect; // 切面类
public CglibProxy(Object target, MyAspect aspect) {
this.target = target;
this.aspect = aspect;
}
// 创建代理对象
public Object createProxy() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass()); // 设置目标类的父类
enhancer.setCallback(this); // 设置回调函数
return enhancer.create(); // 创建代理对象
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
aspect.checkPermission(); // 执行前置增强
Object result = method.invoke(target, args); // 执行目标方法
aspect.log(); // 执行后置增强
return result;
}
}
5. 在代理类中实现对UserManager中的所有方法进行增强
UserManager userManager = new UserManagerImpl();
MyAspect myAspect = new MyAspect();
CglibProxy proxy = new CglibProxy(userManager, myAspect);
UserManager userManagerProxy = (UserManager) proxy.createProxy();
userManagerProxy.addUser("张三", "123456"); // 会触发checkPermission和log方法
userManagerProxy.deleteUser("张三"); // 会触发checkPermission和log方法
6. 编写测试类,测试代理类对目标类的增强效果
public class CglibTest {
@Test
public void testProxy() {
UserManager userManager = new UserManagerImpl();
MyAspect myAspect = new MyAspect();
CglibProxy proxy = new CglibProxy(userManager, myAspect);
UserManager userManagerProxy = (UserManager) proxy.createProxy();
userManagerProxy.addUser("张三", "123456"); // 会触发checkPermission和log方法
userManagerProxy.deleteUser("张三"); // 会触发checkPermission和log方法
userManagerProxy.updateUser("李四", "654321"); // 会触发checkPermission和log方法
userManagerProxy.findUserByName("李四"); // 会触发checkPermission和log方法
}
}
执行测试类,可以看到控制台输出了增强方法的输出,证明增强成功。
好家伙,这个不仅是解答啊,这是要开发一个系统啊。建议你找一本 spring 的书读一读吧