============
动态代理开发
============
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
增强 接口