Java Spring自动布线仅适用于接口
我是spring框架的新手,遇到了以下问题 我有一个接口Java Spring自动布线仅适用于接口,java,spring,autowired,Java,Spring,Autowired,我是spring框架的新手,遇到了以下问题 我有一个接口ClassA,它由classedClassA1和ClassA2实现 我将以下bean定义添加到applicationContext.xml <bean id="class1" class="com.abc.ClassA1" /> <bean id="class2" class="com.abc.ClassA2" /> 上面的代码正在抛出错误 无法自动写入字段:com.abc.ClassA1 com.abc.Some
ClassA
,它由classedClassA1
和ClassA2
实现
我将以下bean定义添加到applicationContext.xml
<bean id="class1" class="com.abc.ClassA1" />
<bean id="class2" class="com.abc.ClassA2" />
上面的代码正在抛出错误
无法自动写入字段:com.abc.ClassA1 com.abc.SomeClass.ClassA1;嵌套异常是
org.springframework.beans.factory.noSuchBean定义异常:
没有类型匹配的bean
[com.abc.ClassA1]
但是,如果我将自动布线更改为以下界面:
@Autowired
ClassA classA1;
<bean id="classA1" class="com.abc.ClassA1" autowire="byName" />
<bean id="classA2" class="com.abc.ClassA2" autowire="byName" />
然后ClassA1自动连接到变量。我不知道如何将变量自动关联到ClassA2。出于某种原因,您的类由Spring代理。这种情况之所以会发生,有很多原因。例如,如果使用JPA或AOP,则原始类将被代理
如果一个类实现了一个接口,那么proxy意味着动态代理。因此,基本上是在运行时创建一个新类,该类实现接口,但不从原始类继承。因此,到原始类的自动连接不起作用。如果对象由JDK代理代理,那么它们应该由接口引用。您可以使用CGLIB(在类路径上)和aop配置(在
applicationContext.xml
中)中的proxy target class=“true”
通过具体类创建代理。我尝试了多种方法来解决此问题,但我通过以下方式实现了它
@Autowired
private ClassA classA1;
@Autowired
private ClassA classA2;
在应用程序上下文中,我将bean定义如下:
@Autowired
ClassA classA1;
<bean id="classA1" class="com.abc.ClassA1" autowire="byName" />
<bean id="classA2" class="com.abc.ClassA2" autowire="byName" />
您可以使用
@限定符
注释:
@Autowired
@Qualifier("class1")
ClassA classA1;
@Autowired
@Qualifier("class2")
ClassA classA2;
@Resource(name="class1")
ClassA classA1;
@Resource(name="class2")
ClassA classA2;
参考:
或@Resource
注释:
@Autowired
@Qualifier("class1")
ClassA classA1;
@Autowired
@Qualifier("class2")
ClassA classA2;
@Resource(name="class1")
ClassA classA1;
@Resource(name="class2")
ClassA classA2;
参考:我在自动连接抽象服务方面也有类似的问题。您可以使用以下无任何问题的代码:
@Autowired
@Qualifier("classA1")
private ClassA1 classA1;
@Autowired
@Qualifier("classA2")
private ClassA2 classA2;
只有当您像这样声明bean时,这才有效
<bean id="class1" class="com.abc.ClassA1" />
@Component("classA1")
public class ClassA1 {
...
}
从我所看到的一点到现在,它似乎没有任何限制,关于可以标记为@Autowired的类的类型
与问题无关,但文章提到了情况本身这有帮助吗?这意味着我必须避免在自动连接类中使用接口?不,不。你可以自动连接接口。在我的例子中,我使用注释自动连接,一个服务由其inferface而不是其类自动连接,我必须删除接口或创建一个伪接口。顺便说一句,良好的做法是根本不使用autowire。它会减慢bean的创建速度,从而导致应用程序的启动。使用@Resource和wire按bean的名称(而不是按类型!)要好得多。好吧,有不同的架构师和不同的观点。有人说大多数bean都是单例的,因此它只影响应用程序的启动,因此它并不重要。但作为一名开发人员,如果应用程序在两分钟而不是30秒内启动,这可能会很烦人。我说的是相当大的应用程序。这是唯一看起来有效的东西!!谢谢。