如何在Spring启动期间强制实例化所有引用的bean?

时间:2009-07-13 21:11:11

标签: java spring

我的applicationContext.xml:

<bean id="studentService" class="com.coe.StudentService">
    <property name="studentProfile" ref="studentProfile" />
</bean>

<bean id="studentProfile" class="com.coe.student.StudentProfile">

</bean>

我的web.xml:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

我的课程:

StudentService{
private StudentProfile studentProfile;
//has appropriate getters/setters

}

StudentProfile{
private String name;
//has getter/setter

}

我有一个调用studentService.studentProfile.name的jsp,错误说studentProfile为null

我的假设是,当服务器启动时,Spring会根据请求实例化所有对象,所以当调用StudentService时,Spring也不会设置StudentProfile吗?

3 个答案:

答案 0 :(得分:2)

通常使用Spring和Web应用程序,您将拥有一个传递到JSP视图的DispatcherServlet和一堆控制器。这些控制器将由Spring管理。

如果你想在不使用DispatcherServlet的情况下直接进入JSP,那么你需要一些方法来第一次注入你的页面(ContextLoaderListener不会这样做)。也就是说,您必须使用JSP初始化代码(例如

)显式查找初始bean

[免责声明:未经测试]

<%@ page import="org.springframework.web.context.support.WebApplicationContextUtils" %>
<%!
    private StudentService studentService;

    public void jspInit() {
        studentService = (StudentService) WebApplicationContextUtils.
            getRequiredWebApplicationContext(getServletContext()).
                getBean("studentService");                  
    }
%>

答案 1 :(得分:1)

也许你的name属性是null项。尝试设置值

<property name="name" value="my value"/>

答案 2 :(得分:0)

如果您愿意使用注释,则不是您的问题的答案,而是您问题的可能解决方案:

Web.xml中

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

Spring.xml

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

Java代码

@Service
StudentService{
@Autowired
private StudentProfile studentProfile; }

@Repository//???
StudentProfile{
private String name;}

那说我理解为什么StudentProfile会成为一个bean(假设每个学生都有个人资料)并且StudentService会引用一个StudentProfile,但这可能只是你的术语......(或者我缺乏理解)物)