6

我正在使用 Spring 3.1 构建一个 Google App Engine 应用程序,并且在将成员连接到我的一个 jar 中时遇到问题。

我有三个项目:

  1. server
  2. server.model
  3. server.persistence

我有一个 ant 构建脚本,因此当我的工作区构建时,它会为server.modeland创建 jar server.persistence,并将它们放在server项目的正确 lib 目录中。

在中,我可以从和server中自动连接东西,但是在我的bean 中,即使它们与 中的完全相同,也没有连接。 server.modelserver.persistenceserver.modelserver.persistenceserver

我的 servlet 应用程序配置中的片段:

<context:component-scan base-package="com.impersonal.server"/>          

<bean autowire="byType" id="appEngineDataStore" class="com.impersonal.server.persistance.AppEngineDataStore"/>

<bean autowire="byType" id="userList" class="com.impersonal.server.model.UserList"/>

server我在项目和项目中都有以下代码server.model,只有服务器一个得到满足。这是失败的一个:

package com.impersonal.server.model;

import java.util.ArrayList;
import java.util.UUID;

import org.springframework.beans.factory.annotation.Autowired;

import com.impersonal.server.persistance.AppEngineDataStore;
import com.impersonal.server.persistance.IDataStore;

public class UserList extends ArrayList<User>
{
    private UserList(){}

//this is always null, but the same line in a class in the other project works
private @Autowired AppEngineDataStore _dataStore;

public UserList(UUID userId, String tempId)
{
    String poo = "poo";
    poo.concat("foo ");

    int i = 3;
}
}

编辑: 刚刚在server.model项目中做了一个测试,试图@Autowired 一些我没有在我的应用程序配置中定义为 bean 的东西,并且没有得到任何错误。如果我为项目做同样的事情,我应该得到一个“没有找到这样的 bean”错误server

任何想法为什么?

4

5 回答 5

3

我错误地实例化了我的对象。对于框架对象和诸如 MVC 控制器之类的对象,您无需执行任何操作即可连接您的 @Autowired 成员。

对于我动态创建的对象,我没有通过 IOC 容器,这就是为什么它们的依赖关系没有得到满足。

于 2012-06-21T19:16:09.520 回答
1

<context:component-scan/>tag 搜索带注释的类。

如果您要使用@Autowire注释自动装配类,则应该使用构造型注释(@Component、@Controller、@Service、@Repository)之一对自动装配类进行注释。Spring首先解析注解配置,然后解析xml配置。这是在spring doc中写的

注解注入在 XML 注入之前执行,因此后一种配置将覆盖前一种配置,用于通过两种方法连接的属性。

检查spring doc上的证明。

因此,您需要做的是为server项目中的类以及server.model. 在您的第三个项目中也是如此server.persistence。根据层或功能添加注释。

于 2012-06-21T12:52:45.513 回答
0

尝试:

@Autowired(required = true)
private AppEngineDataStore _dataStore;

代替:

private @Autowired AppEngineDataStore _dataStore;

编辑1:

在使用上面的自动装配时,在你的 spring xml 中,尝试:

<bean id="appEngineDataStore" class="com.impersonal.server.persistance.AppEngineDataStore" scope="prototype"></bean>

代替:

<bean autowire="byType" id="appEngineDataStore" class="com.impersonal.server.persistance.AppEngineDataStore"/>
于 2012-06-21T08:42:10.100 回答
0

autowire在 xml 中意味着稍微不同的东西。您可以将其注释为 ,而不是在 xml 中定义您的 bean @Service,它将被组件扫描发现并且@Autowired将起作用。

于 2012-06-21T09:05:04.443 回答
0

在您的 xml 配置中,使用autowire-candidate属性

<bean autowire="byType" id="appEngineDataStore" class="com.impersonal.server.persistance.AppEngineDataStore" autowire-candidate="true" />
于 2012-06-21T09:10:42.337 回答