在Spring中继承@Component

时间:2017-04-03 23:33:00

标签: java spring inheritance

我有一个类的层次结构。我想用@Component标记它们。我试图只标记父类。我希望Spring也将孩子视为组件。但它不会发生。

我尝试使用自定义"No qualifying bean of type 'bean.inherit.component.Child' available"注释,如here所述。它不起作用。

我写了一个单元测试。它失败了:@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Component @Inherited public @interface InheritedComponent {} @InheritedComponent class Parent { } class Child extends Parent { } @Configuration @ComponentScan(basePackages = "bean.inherit.component") class Config { } @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = Config.class) public class InheritComponentTest { @Autowired private Child child; @Test public void name() throws Exception { assertNotNull(child); } } 。 Spring版本是4.3.7。

{{1}}

2 个答案:

答案 0 :(得分:6)

您可以使用ComponentScan.Filter。

df$new_col<-df[, grepl("lolz", names(df))]*df[, grepl("lel", names(df))]

这将允许Spring自动装配您的Child,而无需直接将注释附加到Child。

答案 1 :(得分:1)

回答已接受的答案“如何在XML中做”所提出的问题 这摘自《 Spring in Action》,我举了一个简单的例子。

用组件注释基类,添加限定符

@Component
@InstrumentQualifier("TUBA")
public class Instrument {}

限定子类-注意-不需要@component

@InstrumentQualifier("GUITAR")
public class Guitar extends Instrument {}

像这样注入

@Autowired
@InstrumentQualifier("GUITAR")
public void setInstrument(Instrument instrument) {this.instrument =instrument;}

在context.xml中,为可分配类型添加一个包含过滤器

<context:component-scan base-package="some.pkg">
<context:include-filter type="assignable" expression="some.pkg.Instrument"/>
</context:component-scan>

类型和表达式在这里定义策略。 您还可以将类型用作“注释”,表达式将是定义自定义限定符以实现相同目标的路径。