Java 继承类的Spring引导注入

Java 继承类的Spring引导注入,java,spring,inheritance,spring-boot,inject,Java,Spring,Inheritance,Spring Boot,Inject,我正在开发一个java核心库,如果更改保持在最低限度,它将保持一个类Foo,其中Foo由SpringREST接口使用,并自动连接到rest接口 我必须扩展Foo来重写它的一个方法,该方法调用Foo.init(),从而稍微改变初始化 我的FooExtend是从我的项目中的另一个类自动连接的,我希望这两个类引用同一个对象,FooExtend对象,但目前我得到一个Foo对象和一个FooExtend。我应该如何解决这个问题?下面的例子 @Component public class Foo{ @Po

我正在开发一个java核心库,如果更改保持在最低限度,它将保持一个类Foo,其中Foo由SpringREST接口使用,并自动连接到rest接口

我必须扩展Foo来重写它的一个方法,该方法调用Foo.init(),从而稍微改变初始化

我的FooExtend是从我的项目中的另一个类自动连接的,我希望这两个类引用同一个对象,FooExtend对象,但目前我得到一个Foo对象和一个FooExtend。我应该如何解决这个问题?下面的例子

@Component
public class Foo{
  @PostConstruct
  private void init() {
    startStuff();
  }

  protected void startStuff(){
    //Stuff done here
  }
}

@Component
public class FooExtend extends Foo{
  @PostConstruct
  private void init() {
    //Nothing is done here
  }

  @Override
  protected void startStuff(){
    //Different altered stuff is done here
  }
}

尝试从扫描中排除Foo类

@ComponentScan(value = {'your.package.here'}, excludeFilters = {
  @ComponentScan.Filter(classes = { Foo.class })
})

根据您的要求,有两种可能的答案:

1) 您希望在Spring上下文中同时注册Foo和FooExtend。 在这种情况下,您可以使用@Qualifier annotation注入一个或另一个实例:

@Autowired
@Qualifier("fooExtend")
Foo foo;
2) 您只想在Spring上下文中注册FooExtend

@ComponentScan(value = {'your.package.here'}, excludeFilters = {
 @ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=Foo.class))
}

但是,要求Foo和FooExtend位于不同的软件包中,以便上述过滤器不会排除FooExtend。

我不确定是否理解您的问题。您有两个bean,一个名为“foo”的bean和一个名为“footextend”的bean。在我看来,您应该能够使用@Qualifier(“fooExtend”)或@Qualifier(“foo”)以及@Autowired,在对foo的引用之上自动连接一个或另一个。我不能对foo进行这样的更改,因为它在核心包中,因此不应该根据核心更改为销毁其他项目。或者我应该把它放在我自己的包里吗?你应该把它放在你的spring靴子上(而不是核心包中)。因此,当你的应用程序启动Foo.class的a bean时,它不会被创建。无法使其工作,我可能会在我对该类的定义中出错,但我在执行此操作时遇到此错误:
java.lang.IllegalArgumentException:处理@ComponentScan注释类型筛选器时出错:class com.companyname.projectname.core.Foo不可分配给接口java.lang.ANNOTATION.ANNOTATION
此解决方案的一个问题是core有自己的@ComponentScan,包括富。所以这个排除可能只会因为找不到任何东西而中断。如果您不想在Spring上下文中注册Foo,那么它是一个正确的解决方案。尝试指定筛选器类型:@ComponentScan.filter(type=FilterType.ASSIGNABLE\u type,value=Foo.class)。但是,要求Foo和FooExtend位于不同的包中,以便在Spring上下文中注册FooExtend。解决方案2是首选方案,但Foo位于Core的Spring上下文中,导致它仍然处于loadedIt状态,这取决于如何从Core库扫描/注册bean。如果它是@ComponentScan,那么您可以通过过滤器排除它。我无法使它工作。它给了我以下错误:
java.lang.IllegalArgumentException:处理@ComponentScan注释类型筛选器时出错:class com.companyname.projectname.core.Foo不可分配给接口java.lang.ANNOTATION.ANNOTATION