关闭Spring @Service的自动装配

时间:2013-06-03 20:01:42

标签: java spring service autowired

我有一个自定义注释,声明为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的其余代码,我不想这样做。

2 个答案:

答案 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注册。