@DeclareParents注解

  1. @DeclareParents
    1. 注解说明
    2. 例子:用户注册
      1. 现有功能的实现
      2. 扩展校验接口与默认实现
      3. 对service接口的所有实现类添加默认实现
      4. 单元测试
    3. 小结

概述:文章介绍@DeclareParents注解的使用,该注解用于对目标类的增强,即为目标类添加新的方法。

@DeclareParents

对目标类进行增强(扩展),即为目标类引入新的方法。

注解说明

  • value属性指定了哪种类型的bean要引入该接口。
  • defaultImpl属性指定了为引入功能提供实现的类。
  • @DeclareParents注解所标注的静态属性指明了要引入了接口。

例子:用户注册

需求描述:用户注册,扩展对用户名进行敏感词汇过滤。

现有功能的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//entity
@Setter
@Getter
@ToString
public class User {
private String nickname;
}
//service接口
public interface UserService {
public void save(User user);
}
//接口实现
@Service
@Slf4j
public class UserServiceImpl implements UserService{
@Override
public void save(User user) {
log.info("保存一条用户信息:{}",user);
}
}

扩展校验接口与默认实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//校验扩展接口
public interface ValidateExtensionService {
/**
* 判断敏感字符串
* @param context
* @return
*/
boolean isSensitive(String context);
}
//校验实现
@Component
public class ValidateExtensionServiceImpl implements ValidateExtensionService {
@Override
public boolean isSensitive(String context) {
return StringUtils.isEmpty(context)?false:context.contains("共产党");
}
}

对service接口的所有实现类添加默认实现

1
2
3
4
5
6
7
8
9
10
11
12
@Component
@Aspect
public class DeclareParentsAspect {
/**
* 让目标类具备当前声明接口中的方法
* com.examples.demo5.UserService+ 表示该接口下的所有实现类
* defaultImpl 为目标接口的所有实现类添加一个默认的实现类
*/
@DeclareParents(value = "com.examples.demo5.UserService+",
defaultImpl = ValidateExtensionServiceImpl.class)
private static ValidateExtensionService validateExtensionService;
}

单元测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//配置类
@Configuration
@ComponentScan
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class Cfg5 {
}
//测试类
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {Cfg5.class})
@Slf4j
public class UserServiceImplTest {

@Autowired
UserService userService;

@Test
public void save() throws IllegalAccessException {
User user = new User();
user.setNickname("ABC共产党DEF"); //共产党
//校验
ValidateExtensionService validateExtensionService =
(ValidateExtensionService) userService;
if(validateExtensionService.isSensitive(user.getNickname())){
log.info("非法字符串");
throw new IllegalAccessException("非法字符串");
}else{
userService.save(user);
}
}
}

小结

通过 @DeclareParents注解为UserService接口的实现类,扩展一个敏感词汇过滤的方法。

@DeclareParents使用步骤:

  1. 编写扩展接口,并提供默认功能的实现类;
  2. 编写切面类,声明一个扩展接口的成员变量;
  3. 添加 @DeclareParents注解
    1. value: 指定目标接口的实现 value = "com.examples.demo5.UserService+"
    2. defaultImpl:提供扩展接口的默认实现
  4. 将目标强制转换类型为扩展接口,并调用增强方法