我有一个自定义注释,声明为Spring托管服务:
@Service
public @interface MyServiceAnnotation {
// my service url
String url();
}
The above declaration enables my services to be autowired as Spring Managed beans.
@MyServiceAnnotation(url="/path/serviceLocation")
public class SomeService {
doWork();
}
但是,某些服务的bean定义在applicationContext.xml
中。将@MyServiceAnnotation
添加到此类bean会使它们同时启用自动装配,并通过xml文件注入依赖性。
由于与遗留代码相关的问题,我不想删除xml bean定义并将它们全部自动装配。
那么,在这种情况下,有没有办法可以关闭自动装配,仍然使用@MyServiceAnnotation
?理想情况下,我希望在@Service
上使用MyServiceAnnotation
注释,现有服务仍将使用@MyServiceAnnotation
,但会根据xml注入其依赖项。所有新服务都将在没有xml bean定义的情况下自动装配。
一种可能的方法是创建与NonSpringManagedMyServiceAnnotation
相同的MyServiceAnnotation
,但不要使用@Service
注释。这样做的缺点是我必须复制MyServiceAnnotation
的其余代码,我不想这样做。
答案 0 :(得分:3)
这是一种方法,但可能不是那么理想。我假设您在xml中指定了一个component-scan
标记来扫描具有Spring构造型注释的类,这些标记支持exclude-filter
子标记以忽略特定模式。如果您指定的文件遵循特定模式(特定包,特定名称等),那么您可以简单地指定此子标记以忽略包含注释的类。
<context:component-scan base-package="mypackage">
<context:exclude-filter type="regex" expression=".*ToBeIgnoredNaming"/>
</context:component-scan>
答案 1 :(得分:0)
我认为你应该尽量保持关注的分离。
在注释中添加@Service
使其成为事实上的Spring服务:因为这不是您想要的行为,您可以在每个服务上使用简单的@MyAnnotation
(带url属性)(legacy和新)。
然后在每个新服务上添加Spring的@Service
注释,以通过注释启用bean注册。