============ 动态代理开发 ============ 1 添加依赖 /pom.xml: org.springframework spring-aop 5.1.14.RELEASE org.aspectj aspectjrt 1.8.8 org.aspectj aspectjweaver 1.8.3 2 原始类对象 /src/main/java/cn/tedu/proxy/UserService.java: public interface UserService { public void register(User user); public User login(String username, String password); } /src/main/java/cn/tedu/proxy/UserServiceImpl.java: public class UserServiceImpl implements UserService { private Logger logger = Logger.getLogger(UserServiceImpl.class); @Override public void register(User user) { logger.debug("UserServiceImpl.register"); // 核心功能 } @Override public User login(String username, String password) { logger.debug("UserServiceImpl.login"); // 核心功能 return null; } } /src/main/resources/applicationContext.xml: 2 提供辅助功能 将辅助功能写在MethodBeforeAdvice接口的实现类中。 /src/main/java/cn/tedu/proxy/Before.java: public class Before implements MethodBeforeAdvice { private Logger logger = Logger.getLogger(Before.class); @Override public void before(Method method, Object[] objects, Object o) throws Throwable { logger.debug("Before.before"); // 辅助功能 } } /src/main/resources/applicationContext.xml: 3 配置需要被辅助功能(增强)捆绑(切入)的核心功能(切入点) /src/main/resources/applicationContext.xml: 4 将辅助功能(增强)捆绑(切入)到核心功能(切入点)上 /src/main/resources/applicationContext.xml: Before.before UserServiceImpl.register Before.before UserServiceImpl.login 例程:Proxy UserService userService = applicationContext.getBean( "userService", UserService.class); ____________代理____________ / v userService = {$Proxy12@3961} "cn.tedu.proxy.UserServiceImpl@2687f956" \_______ _______/ v 并非UserServiceImpl类的对象, 而是一个代理类(Proxy)的对象, 代理UserServiceImpl类的对象。 虽然配置文件是这样的 但根据对象ID——userService从Spring工厂中获得的并非原始类UserServiceImpl的对象,而是该对象的代理对象。此代理对象可赋值给接口——UserService——代理类和原始类实现了同一个接口,这点动态代理和静态代理是一致的。 总结: 接口 Spring | 工厂 v | 原始类->增强类--- | | | | v 原始<---增强<-------代理 方法 方法 | | ^ | | |_____________| v 增强 接口