当前位置: 首页 > 知识库问答 >
问题:

不管怎么说,@inject/@autowire一个内部类到一个外部类?

康言
2023-03-14
@Component
public class TestClass{

    // How to declare this class?
    private class TestClassInner{
       @Autowired private SomeBean somebean;

       public boolean doSomeWork(){
          return somebean.doSomething();
       }               
    }

    // Inject the inner class here in the outer class such that the outer class can use an instance of it
    @Autowired TestClassInner innerClass;

    @PostConstruct
    public void init(){
        ...
    }

    public void someMethod(){
       innerClass.doSomeWork();
       ...
    }
}

我试过用@Component注释内部类,使其成为公共类,使其成为公共静态类,等等,但似乎我试过的每一种组合都以抛出这样或那样的错误结束。

作为一个私有的内部类,Spring抱怨它缺少一个构造函数,即使我定义了一个。

作为一个带注释的@component公共静态类,Spring抱怨它发现了两个bean-TestClass@TestClassInner和TestClass.TestClassInner。如果我使用@qualifier,它会抱怨找不到bean。

下面是我尝试过的几种组合(包括尝试实现一个基于@SotiriosDelimanolis响应的新构造函数):

    // How to declare this class?
@Component
public class TestClassInner{
    @Autowired private ProviderService providerService;

    public TestClassInner(){
        super();
    }
    public TestClassInner( TestClass t){
        super();
    }
}

抛出错误(public和private内部类都抛出相同的错误):

Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.ia.exception.TestClass$TestClassInner]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.ia.exception.TestClass$TestClassInner.<init>()
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:83)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1030)
    ... 54 more

我刚刚尝试使用一个静态公共嵌套类与我的测试类(上面),它似乎注入正确。另一方面,在我的实际控制人中,它发现了2个匹配类:

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.ia.web.ContractController$InnerClass] is defined: expected single matching bean but found 2: com.ia.web.ContractController$InnerClass,contractController.InnerClass
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:865)
@Controller
public class ContractController {

    @Component
    static public class InnerClass extends AttachmentControllerSupport{

        /**
         * 
         */
        public InnerClass() {
            super();
            // TODO Auto-generated constructor stub
        }

        public InnerClass( ContractController c){
            super();
        }
    }

    @Autowired private InnerClass innerclass;

    @Autowired private AttachmentControllerSupport attachmentControllerSupport;
    @Autowired private ContractService contractService;

}
<context:component-scan base-package="com.ia">
    <context:exclude-filter expression=".*_Roo_.*" type="regex"/>
    <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>
<context:spring-configured/>
<mvc:annotation-driven conversion-service="applicationConversionService" >
  <mvc:argument-resolvers>
    <bean class="org.springframework.security.web.bind.support.AuthenticationPrincipalArgumentResolver" />
  </mvc:argument-resolvers>
</mvc:annotation-driven>

共有1个答案

卫子平
2023-03-14

可以通过@component注释声明和实例化内部类bean,但解决方案很难看,但我稍后将讨论它。首先,下面是如何使用XML中的 声明来实现这一点。给定

package com.example;

public class Example {
    @Autowired
    private Inner inner;
    public class Inner {        
    }
}

你会有

<bean name="ex" class="com.example.Example" />
<bean name="inner" class="com.example.Example$Inner">
    <constructor-arg ref="ex"></constructor-arg>
</bean>

对于内部类,任何构造函数都将其第一个参数隐式声明为封闭类型的实例。

所以

public Inner() {}

上面的内容实际上会被汇编成

public Inner (Example enclosingInstance) {}

在Java代码中,该参数的参数是隐式提供的

enclosingInstance.new Inner();
@Component
public class Example {
    @Component
    public class Inner {
        @Autowired
        public Inner() {}

    }
}
 类似资料:
  • 问题内容: 在Spring / JSR-330中,是否有一种方法可以正确地声明需要依赖项注入的内部类,以便可以将其注入外部类? 例如: 我尝试用@Component注释内部类,使其成为公共类,使其成为公共静态等,但是似乎我尝试过的每种组合总是最终会抛出一个错误或另一个错误。 作为一个私有内部类,Spring抱怨即使我定义了一个构造函数,它也缺少一个构造函数。 作为一个带注释的公共静态类,Sprin

  • 为什么我不能这样做/是否有解决方法来实现这一点: 这两个编译错误是 > On

  • 我已经创建了一个模块/jar,并将其用作util库。我在其中创建了一个服务,如下所示: 那么,如何将bean从lib带入应用程序呢?当然有办法。您必须将库设置为一个完整的spring MVC应用程序才能工作吗?也就是说,你必须在库中设置@configuration和@componentscan吗?

  • 我有一个类“C”,它有一个内部类“Ci”。“C”类继承了“S”类。“S”类也有一个内部类“Si”。“Ci”能继承“Si”吗?非常感谢任何回应的人。 这样的事情可能吗?

  • 考虑类<代码> OuterClass < />代码> <代码> InnerClass < /代码> 第二个类,它试图扩展

  • 问题内容: 从我的阅读中,我记得如果您只能从一个匿名内部类中创建一个对象,并且由于这个原因,如果您想创建一个类并想要从该一个类中创建多个对象(不使用反射),不使用匿名内部类,而是使用私人内部类或旁听类,但是人们告诉我我错了。有人可以帮我澄清一下吗?请检查链接,因为它包含更多详细信息,但是如果不清楚,请提出要求! 问题答案: 您可以创建任意数量的匿名类对象,可以在代码中的一个位置创建它们(除非您复制