首页 > 代码库 > JSP中使用Spring注入的Bean时需要注意的地方

JSP中使用Spring注入的Bean时需要注意的地方

遇到问题

遇到一个问题:在JSP中,使用Spring注入的Bean对象时,未能正确地获取到想要的对象。

郁闷的是,它也没报错。

 

研究问题

使用DEBUG功能(好久不在JSP里写Java代码了,都忘了JSP也可以打断点调试),跟踪了一下代码,发现确实有了我想使用的类的实例,不过是个代理类

想到反射代理相关的知识,貌似知道问题在哪了。

赶紧试了一下,果然……

 

解决

在JSP里你要获得的Bean对象的类型,要定义成接口类,而不是实现类

当然,这也视情况而定,我不确定,在JSP里使用Spring注入的Bean对象是不是都是代理类。

 


 

举个例子吧!

(注意,例子中的代码[伪代码]不一定正确,只是为了说明问题的一个类比)

首先定义在JSP中要用到的类。

两个,一个接口,一个实现类。

接口

1 package com.blabla;2 3 interface IFoo {4 5     String sayHello(String name);6 }

 

实现类

1 package com.blabla;2 3 public class FooImpl implements IFoo {4 5     public String sayHello(String name) {6 7         return "Hello " + name + " !!";8     }9 }

 

Spring,Bean的定义

省略……

 

使用Bean的JSP文件

 1 <!-- 该引入的要引入 --> 2 <%@page import="org.springframework.web.context.WebApplicationContext" %> 3 <%@page import="org.springframework.web.context.support.WebApplicationContextUtils" %> 4  5 <%@page import="com.blabla.IFoo" %> 6  7 <!-- 下面开始使用JAVA --> 8 <% 9 // 10 WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());11 12 /*13  * 注意,这里不能使用实现类来定义对象,即:14  *   FooImpl fooObj = (FooImpl) ctx.getBean("beanFoo");15  * 即使,你在Spring的Bean文件中定义的是这个实现类FooImpl,16  * 但在接收时,需要使用 接口类 IFoo 来定义17  *18  * 为什么要这样??19  * 去看看反射机制、代理机制吧20  *21  */22 IFoo fooObj = (IFoo) ctx.getBean("beanFoo");23 24 String helloStr = fooObj.sayHello("Angle");25 26 System.out.println(helloStr);27 %>