【发布时间】:2014-06-13 21:07:29
【问题描述】:
在 Spring/JSR-330 中,有没有办法正确声明需要依赖注入的内部类,以便我可以将其注入到外部类中?
例如:
@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。
我想我误解了这些内部 bean 如何工作/与 Spring 交互以正确理解是否/如何声明它们。
这可能吗?
编辑
以下是我尝试过的一些组合(包括尝试实现基于@SotiriosDelimanolis 响应的新构造函数):
// How to declare this class?
@Component
public class TestClassInner{
@Autowired private ProviderService providerService;
public TestClassInner(){
super();
}
public TestClassInner( TestClass t){
super();
}
}
抛出错误(公共和私有内部类都抛出相同的错误):
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)
编辑 2
@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;
}
applicationContext.xml:
<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/>
restmvc-config.xml:
<mvc:annotation-driven conversion-service="applicationConversionService" >
<mvc:argument-resolvers>
<bean class="org.springframework.security.web.bind.support.AuthenticationPrincipalArgumentResolver" />
</mvc:argument-resolvers>
</mvc:annotation-driven>
【问题讨论】:
-
对于初学者来说,您不正确的术语会混淆一个本身就足够复杂的问题。在 Java 中,“内部类”具体来说是一个非静态嵌套类;嵌套类可以是内部的或静态的。
-
@chrylis 我实际上并没有意识到这一点。感谢您的澄清。我在这里使用术语“内部类”来指代嵌套类。我会考虑到这一点来尝试编辑帖子
标签: java spring dependency-injection