Java 奇怪的Spring上下文组件扫描

Java 奇怪的Spring上下文组件扫描,java,spring,Java,Spring,我已经从stackoverflow找到了很多解决方案,这是我第一次在这里问问题,我真的不知道这有什么问题。实际上,我正在尝试按类型自动关联我的一个类,但无法做到这一点。下面是按顺序排列的源代码 Spring上下文 我使用搜索管理器并测试FileUploadDao对象的代码是否为null Web.xml http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd“> SearchServlet com.bakaenterprise.server.Searc

我已经从stackoverflow找到了很多解决方案,这是我第一次在这里问问题,我真的不知道这有什么问题。实际上,我正在尝试按类型自动关联我的一个类,但无法做到这一点。下面是按顺序排列的源代码

Spring上下文

我使用搜索管理器并测试FileUploadDao对象的代码是否为null Web.xml

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd“>


SearchServlet
com.bakaenterprise.server.SearchServlet
SearchServlet
/servlet/SearchServlet
30
index.jsp
/jstl/core\u rt
/WEB-INF/tld/c.tld
/jstl/xml\u rt
/WEB-INF/tld/x_rt.tld
/jstl/fn\u rt
/WEB-INF/tld/fn.tld
/jstl/fmt\rt
/WEB-INF/tld/fmt.tld
演出
com.bakaenterprise.util.PerformanceLog
演出
/*
上下文配置位置
/WEB-INF/springContext.xml
org.springframework.web.context.ContextLoaderListener
现在文件Dao总是空的,虽然基本包是正确的,但我认为它没有扫描组件。任何帮助或建议都将受到高度重视和赞赏。我知道这种类型的问题被问了很多次,所以很抱歉再次问这个问题,这些答案对我不起作用


我相信您必须在applicationContext中为要自动连线的bean显式声明这一点

<bean id="searchManager" class="com.bakaenterprise.bl.SearchManager" autowire="byType"/>


另一种选择是autowire
byName
,它也应该在您的情况下工作(因为成员变量
fileDao
与bean ID
fileDao
具有相同的名称)。

我相信您必须在applicationContext中为要自动wire的bean明确声明这一点

<bean id="searchManager" class="com.bakaenterprise.bl.SearchManager" autowire="byType"/>


另一种方法是autowire
byName
,这也适用于您的情况(因为成员变量
fileDao
与bean ID
fileDao
具有相同的名称)。

SearchManager
也应该为组件扫描期间注入的
IFileUploadDao
实现bean添加注释

@Component
public class SearchManager {
另外,您正在手动初始化
SearchManager
,这将导致其依赖项没有被注入-bean需要由
Spring
管理。由于没有直接的方法将Spring bean注入Java Servlet,因此您可以使用Spring框架
HttpRequestHandler

public class AnnotatedHttpServletRequestHandler implements HttpRequestHandler {

   @Autowired
   private SearchManager searchManager;
   ...
}

具体细节在

SearchManager
中进行了描述,还应为组件扫描期间注入的
IFileupLoadAO
实现bean添加注释

@Component
public class SearchManager {
另外,您正在手动初始化
SearchManager
,这将导致其依赖项没有被注入-bean需要由
Spring
管理。由于没有直接的方法将Spring bean注入Java Servlet,因此您可以使用Spring框架
HttpRequestHandler

public class AnnotatedHttpServletRequestHandler implements HttpRequestHandler {

   @Autowired
   private SearchManager searchManager;
   ...
}

具体细节在

中描述。请尝试在spring上下文配置中添加dependens-depend属性:

<bean id="searchManager" class="com.bakaenterprise.bl.SearchManager" 
      depends-on="fileDao" />
所以,您只需创建一个bean的两个副本!我认为这是一个问题

编辑-2

尝试删除此XML定义:

<bean id="searchManager" class="com.bakaenterprise.bl.SearchManager" />

<bean id="fileDao" class="com.bakaenterprise.dal.impl.FileUploadDao" />

尝试在spring上下文配置中添加dependens-depen属性:

<bean id="searchManager" class="com.bakaenterprise.bl.SearchManager" 
      depends-on="fileDao" />
所以,您只需创建一个bean的两个副本!我认为这是一个问题

编辑-2

尝试删除此XML定义:

<bean id="searchManager" class="com.bakaenterprise.bl.SearchManager" />

<bean id="fileDao" class="com.bakaenterprise.dal.impl.FileUploadDao" />

您在这里有一些选项,您可以用以下内容注释您的类
SearchManager

  • @组件

  • @Configurable
    “@Configurable”用于标记符合Spring依赖注入条件的类。当您不能或无意将您的类用作SpringBean时,应使用它(从Spring 2.0开始提供)

还有其他方法可以连接您的类,但您可能会失去一些好处

您还应该删除xml声明:

<bean id="searchManager" class="com.bakaenterprise.bl.SearchManager" />

您在这里有一些选项,您可以用以下内容注释您的类
SearchManager

  • @组件

  • @Configurable
    “@Configurable”用于标记符合Spring依赖注入条件的类。当您不能或无意将您的类用作SpringBean时,应使用它(从Spring 2.0开始提供)

还有其他方法可以连接您的类,但您可能会失去一些好处

您还应该删除xml声明:

<bean id="searchManager" class="com.bakaenterprise.bl.SearchManager" />


仅用xml定义bean或使用@Component就足够了。我尝试了您建议的添加Dependes-on属性的解决方案,但没有成功。我仅使用@Component尝试了事件,但使用了相同的方法results@AliAdnan:尝试不在内部使用bean定义XML@seralex.vi我从XML中删除了这两个对象,但仍然是相同的l、 我还用组件注释对SearchManager和FileUploadDao类进行了注释。@AliAdnan:你能在使用SearchManager的地方添加你的web.xml和代码吗?你如何检查fileDao是否为空?只需在xml中定义bean或使用@Component就足够了。我尝试了你建议的添加依赖于属性的解决方案,但没有成功rk.I事件仅使用@Component进行了尝试,但相同results@AliAdnan:尝试不在内部使用bean定义XML@seralex.vi我从XML中删除了这两个类,但仍然是相同的。fileDao对象为null。我还用组件注释注释了SearchManager和FileUploadDao类。@AliAdnan:您能在使用SearchMa的地方添加web.XML和代码吗nager?如何检查fileDao是否为空?但SearchManager已经存在
<bean id="searchManager" class="com.bakaenterprise.bl.SearchManager" />

<bean id="fileDao" class="com.bakaenterprise.dal.impl.FileUploadDao" />
  public SearchServlet extends HttpServlet {

    @Autowired
    private SearchManager searchManager;

    public void init(ServletConfig config) {
      super.init(config);
      SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
        config.getServletContext());
    }
  }
<bean id="searchManager" class="com.bakaenterprise.bl.SearchManager" />