运用javaEE知识进行解答

运用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 的书读一读吧