无法获得Spring来注入我的依赖(Can't get Spring to inject m

2019-09-27 09:47发布

我一直试图让Spring注入的@Autowired依赖到我的应用程序没有效果。 我究竟做错了什么?

我创建了一个名为TimeService豆。 它的工作是当前的时间恢复到任何人问。

package com.foxbomb.springtest.domain.time;

import java.util.Date;
import org.springframework.stereotype.Service;

@Service
public class TimeService {

    public TimeService() {
        super();
        System.out.println("Instantiating TimeService...");
    }

    public Date getTime() {
        return new Date();
    }
}

当然,我要告诉Spring这一点,所以我增加了以下到web.xml中:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring-context.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>  

大,有的Spring配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:annotation-config base-package="com.foxbomb.springtest.domain" />

</beans>

现在我们需要的是一个调用类是想用这种依赖性。 不幸的是,@Autowired在这里似乎什么都不做:

package com.foxbomb.springtest;

import...

@Configurable
public class TimeManager {

    public TimeManager() {
        super();
        System.out.println("Instantiating TimeManager...");
    }

    @Autowired
    private TimeService timeService;

    public Date getTime() {
        return timeService.getTime();
    }

}

最后,想要显示的时间的JSP:

<%@page import="com.foxbomb.springtest.ApplicationContextImpl"%>
<%@page import="com.foxbomb.springtest.TimeManager"%>

<html>
    <head>
        <title>Spring Test</title>
    </head>
    <body>
        <h1>Autowired Dependencies....</h1>
        <p>
            Time is now <%=new TimeManager().getTime()%>!
        </p>

    </body>
</html>

但我得到的是:

java.lang.NullPointerException
    com.foxbomb.springtest.TimeManager.getTime(TimeManager.java:26)

Answer 1:

当您访问TimeManager对象是这样的:

Time is now <%=new TimeManager().getTime()%>!

春天不知道这个类东西。 你基本上是创建一个新的对象,这就是它!

也许春天创建的实例TimeManager和依赖注入正确(但你应该使用@Service ,而不是@Configuration注释),但你是不是在你的JSP使用这个实例。 相反,你正在创造新的,非托管的情况下,这是完全独立的,不知道春天和依赖...

认为这将工作:

<%= WebApplicationContextUtils.
  getWebApplicationContext(application).
  getBean(TimeManager.class).
  getTime() %>

丑陋? 当然。 由于访问服务从JSP(视图)的整个方法是丑陋的。 你至少应该有访问的Spring bean,并把结果在请求属性的servlet。 这些属性然后可以在JSP来访问你转发给 - 不丑小脚本。

如果你真的想这样做“正确”的方式,尝试Spring MVC的或其他流行的Java Web框架。



Answer 2:

在TimeManager的@Autowire注释无法识别,因为你告诉春天开始搜索在错误的包标注的配置信息。

TimeManager是com.foxbomb.springtest。

你有这样的配置:

<context:annotation-config base-package="com.foxbomb.springtest.domain"/>

请注意, “com.foxbomb.springtest!= com.foxbomb.springtest.domain”。

更改配置以包括此:

<context:annotation-config base-package="com.foxbomb.springtest"/>

编辑:春天必须实例TimeManager。

您需要:

  1. 有TimeManager是控制器类的数据成员。
  2. @Autowire TimeManager到控制器类(或从春天获得它在某种程度上)。
  3. 在TimeManager加入一些适当的范围内(也许会,也许要求,也许应用程序)。
  4. JSP页面上访问此TimeManager。 也许是这样的: It is now ${MyTimeManager.time} balonia watch time.


Answer 3:

我倾向于@TomaszNurkiewicz同意; 使用一个框架。 然而,框架方式矫枉过正了大量的应用。 如果它是矫枉过正你, 这个答案详细介绍了如何做才不至于让自己的bean的所有工作手册。 国际海事组织做手工失败的目的。



Answer 4:

您应该使用@Component (或孩子的刻板印象注释),而不是@Configuration ,和注释你的TimeManager这一点。 @Configuration用于基于Java容器配置,这是不是你在这里做什么。



Answer 5:

最后!

我把它用在上面的示例代码工作。 诀窍是建立宽/ J和织造。 这使得@Configurable注解的类来实现自动,它依赖于Spring注入依赖。

有没有什么错的基础包:)我不小心做了一个XML错字,尝试添加该上下文基础包属性:注释的配置标签。 正确的定义是:

<context:annotation-config/>
<context:component-scan base-package="com.foxbomb.springtest"/>

我其实需要最终需要将其更改为com.foxbomb.springtext以包括试图访问过这个bean类 - 至于到底它也注释。

谢谢大家对你的帮助!



文章来源: Can't get Spring to inject my dependencies