java - 无法让 Spring 注入(inject)我的依赖项

标签 java spring dependency-injection inversion-of-control javabeans

我一直试图让 Spring 将 @Autowired 依赖项注入(inject)我的应用程序,但没有成功。我做错了什么?

我创建了一个名为 TimeService 的 bean。它的工作是将当前时间返回给任何询问的人。

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)

最佳答案

当您像这样访问 TimeManager 对象时:

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

Spring 对这个类一无所知。您基本上是在创建一个新对象,就是这样!

可能 Spring 创建了 TimeManager 实例并正确注入(inject)依赖项(但是您应该使用 @Service 而不是 @Configuration 注释),但是您没有在 JSP 中使用此实例。相反,您正在创建新的非托管实例,它完全独立并且不知道 Spring 和依赖项......

认为这会起作用:

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

丑陋?当然。因为从 JSP( View )访问服务的整个方法很丑陋。您至少应该有一个访问 Spring bean 并将结果放入请求属性的 servlet。然后可以在您转发到的 JSP 中访问这些属性 - 没有丑陋的 scriptlet。

如果您真的想以“正确”的方式执行此操作,请尝试使用 Spring MVC 或其他流行的 Java Web 框架。

关于java - 无法让 Spring 注入(inject)我的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7620574/

相关文章:

java - 可以设置JTable的单元格溢出吗?

java - Java 中的滑动面板

Spring REST 使用 Jackson - 400 错误请求日志记录

c# 依赖注入(inject)与接口(interface)和隐藏内部

asp.net-mvc - 将 ASP.NET MVC 应用程序与 Entity Framework 解耦

c# - RegisterMany 不注册所有接口(interface)

java - JOptionPane 显示一个空白窗口

java - Java中是否可以从外部对象访问隐藏字段?

java - 这里的beanInterface指的是什么?

java - Java Spring 中使用 @OneToMany 关系发生奇怪的开始