我有一个自定义注释,它被声明为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();
}


但是,某些服务在applicationContext.xml中具有其bean定义。将@MyServiceAnnotation添加到此类bean可以使它们既启用自动装配功能,又可以通过xml文件注入依赖项。

由于与遗留代码相关的问题,我不想删除xml bean定义并使它们全部自动装配。

因此,有没有一种方法可以在这种情况下关闭自动装配并仍然使用@MyServiceAnnotation?理想情况下,我想在@Service上具有MyServiceAnnotation批注,现有服务仍将使用@MyServiceAnnotation,但将基于xml注入其依赖项。如果没有xml bean定义,所有新服务将自动装配。

一种可能的方法是创建与NonSpringManagedMyServiceAnnotation相同的MyServiceAnnotation,但是上面没有@Service批注。这样做的缺点是我必须复制MyServiceAnnotation的其余代码,而我不想这样做。

最佳答案

这是一种方法,虽然可能不是最佳的。我假设您已经在xml中指定了component-scan标记来扫描具有Spring构造型注释的类,这些标记支持exclude-filter子标记以忽略特定的模式。如果您指定的文件遵循特定的模式(特定的程序包,特定的名称等),那么您可以简单地指定此子标签来忽略包含注释的类。

<context:component-scan base-package="mypackage">
    <context:exclude-filter type="regex" expression=".*ToBeIgnoredNaming"/>
</context:component-scan>

08-06 10:41