gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:12:02 25 4
gpt4 key购买 nike

我一直试图让 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com