在
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.()
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中:
restmvc-config.xml文件: