【发布时间】:2021-07-24 19:39:34
【问题描述】:
假设我需要使用@MusicAround 建议来增强shower() 方法,以便在执行shower() 方法之前和之后给我一些音乐。
public class Me {
@MusicAround
public void shower() {
// shower code omitted
}
}
首先我创建了新的注解@MusicAround。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MusicAround {
然后用切面MusicAspect绑定它。
@Aspect
public class MusicAspect {
@Around("@annotation(MusicAround)")
public Object musicAround(ProceedingJoinPoint joinPoint) throws Throwable {
IPhone iphone = new IPhone();
Iphone.music();
joinPoint.proceed();
iphone.music();
}
}
将MusicAspect 配置为Bean。 @EnableAspectJAutoProxy 注释离开 spring 来为我封装方面代理。
@Configuration
@EnableAspectJAutoProxy
public class ApplicationConfig {
// ... other beans omitted
@Bean
public MusicAspect musicAspect() {
return new MusicAspect();
}
}
在main方法中,从上下文中获取Me实例,并执行shower()方法。
public static void main(String[] args) {
try {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
Me me = context.getBean(Me.class);
me.shower();
context.close();
} catch (ApplicationContextException ace) {
// handle exception
}
}
现在我可以在淋浴时播放音乐了。
<hey jude>
I'm showering
<don't be so serious>
问题是这样MusicAspect 类与IPhone 类耦合。我想通过注入IPhone 对象作为参数来解耦它们,如下所示,
@Aspect
public class MusicAspect {
@Around("@annotation(MusicAround)")
public Object musicAround(ProceedingJoinPoint joinPoint, IPhone iphone) throws Throwable {
iphone.music();
joinPoint.proceed();
iphone.music();
}
}
当然,这里不允许musicAround() 方法中的第二个参数“iphone”。在这种情况下,我是否可以使用任何弹簧功能来解耦 IPhone 和 MusicAspect?
!注意:感谢@kriegaex 的校对。
【问题讨论】:
-
这个问题来自XY problem:它解释了如何你在技术上梦想实现你的目标,而不是解释你真正想要的什么达到。示例代码不适合解释您的目标,您的解释也是如此。注释只是一个注释,它什么都不做。方面做了一些事情。通过将某些内容“注入”到注释中,您将获得什么,无论这可能意味着什么?请编辑并改进您的问题。谢谢。
-
@kriegaex 现在看起来更好了?
-
感谢@k-wasilewski
@Autowired标签解决了我的问题。
标签: java spring annotations aop aspect