通过spring aop的@DeclareParents为某个类(及其所有子类)动态代理新增实现接口
本节代码 https://download.csdn.net/download/wangwjtt/10908155
修改上节代码(https://blog.csdn.net/wangwjtt/article/details/86210943) ,新增@DeclareParents注解
目录结构如下
Controller
@RequestMapping("/test")
@ResponseBody
public User validateAndPrint(Integer id) {
System.out.println("User");
User user = new User();
user.setId(id);
user.setUsername("wang.li");
user.setNote("AAA");
UserValidator userValidator = (UserValidator) userService;
if(userValidator.myYalidate(user)) {
userService.printUser(user);
}
return user;
}
UserService
import com.springboot.chapter4.pojo.User;
public interface UserService {
public void printUser(User user);
}
UserServiceimpl
/**
* @Service 是标记实现类上的。
* 因为@Service是把spring容器中的bean进行实例化,也就是等同于new操作,
* 只有实现类是可以进行new实例化的,而接口则不能,所以是加在实现类上的。不信你标注到接口上,会报BeanCreationException的。
* @author XXX
*
*/@Service
public class UserServiceimpl implements UserService{
@Override
public void printUser(User user) {
// TODO Auto-generated method stub
if(user == null) {
throw new RuntimeException("检查用户参数是否为空. .. ...");
}
System.out.println("id = "+user.getId());
System.out.println("username = "+user.getUsername());
System.out.println("note = "+user.getNote());
}
}
UserValidator //为了增强UserService接口功能(本接口功能 检测User是否为空)
import com.springboot.chapter4.pojo.User;
/**
* 为了增强UserService接口功能(本接口功能 检测User是否为空)
* @author jiantao.wang
*
*/
public interface UserValidator {
public boolean myYalidate(User user);
}
UserValidatorImpl
public class UserValidatorImpl implements UserValidator{
@Override
public boolean myYalidate(User user) {
// TODO Auto-generated method stub
System.out.println("引入新的接口:"+UserValidator.class.getSimpleName());
return user != null;
}
}
MyAspect
@DeclareParents
value:要增强功能的目标对象(要增强的对象)
defaultImpl:引入增强的类
"+" UserServiceimpl的所有子类
/**
* value:要增强功能的目标对象(要增强的对象)
* defaultImpl:引入增强的类
* "+" UserServiceimpl的所有子类
*/
@DeclareParents(value = "com.springboot.chapter4.aspect.service.impl.UserServiceimpl+",defaultImpl=UserValidatorImpl.class)
public UserValidator userValidator;
Controller
UserValidator userValidator = (UserValidator) userService;
if(userValidator.myYalidate(user)) {
userService.printUser(user);
}