我有一个调用方法的服务。在这个服务中,还有一个字段需要通过aspect使用自定义注解来赋值
服务
@Service
public class TestServiceImpl implements TestService {
@MyAnnotation(value = "someName")
private Boolean isActive;
@Override
public String success(String name) {
return (isActive) ? "Yes" : "No";
}
}
注解
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = ElementType.FIELD)
public @interface MyAnnotation{
String value() default "";
}
通过在注解中传递的值,数据库中应该有一个记录具有is\u active字段,并且该值应该分配给服务中的isactive字段
1条答案
按热度按时间s4n0splo1#
如果您想坚持使用springaop或更灵活的应用程序设计,我还建议您实现另一个应用程序设计。例如,为什么不注解
success(..)
方法并在@Around
根据注解值返回数据库配置值的通知?如果您绝对坚持注解字段,那么您必须同意使用加载时编织(ltw)从SpringAOP切换到本机aspectj,因为aspectj可以通过
get()
以及set()
切入点。但是,如果字段是私有的,则需要特权方面,并且不能使用注解样式语法。下面是我的完整mcve,在spring之外使用aspectj向您展示了它是如何基本完成的:
带有配置键的标记注解:
驱动程序应用程序:
外观:
为了更好地理解细节,请阅读评论。建议#1-#4更像是使用的一般操作指南
get()
以及set()
,最后一条建议(滚动到末尾)是您在这个特定案例中实际要求的。控制台日志:
免责声明:我想向您展示aspectj的强大功能。你可以这样做,但正如我之前所说,这并不意味着你应该这样做。通过注解访问器方法而不是字段,您可以轻松地重新设计应用程序,以使其与springaop一起工作。或者像alexander katsenelenbogen所说的,有一些方法可以完全不用aop来实现这一点,尽管我认为aop是一种合适的方式,因为从外部源读取配置值是一个跨领域的问题。