遇到问题

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

郁闷的是,它也没报错。

研究问题

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

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

赶紧试了一下,果然……

解决

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

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


举个例子吧!

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

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

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

接口

 package com.blabla;

 interface IFoo {

     String sayHello(String name);
}

实现类

 package com.blabla;

 public class FooImpl implements IFoo {

     public String sayHello(String name) {

         return "Hello " + name + " !!";
}
}

Spring,Bean的定义

省略……

使用Bean的JSP文件

 <!-- 该引入的要引入 -->
<%@page import="org.springframework.web.context.WebApplicationContext" %>
<%@page import="org.springframework.web.context.support.WebApplicationContextUtils" %> <%@page import="com.blabla.IFoo" %> <!-- 下面开始使用JAVA -->
<%
//
WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext()); /*
* 注意,这里不能使用实现类来定义对象,即:
* FooImpl fooObj = (FooImpl) ctx.getBean("beanFoo");
* 即使,你在Spring的Bean文件中定义的是这个实现类FooImpl,
* 但在接收时,需要使用 接口类 IFoo 来定义
*
* 为什么要这样??
* 去看看反射机制、代理机制吧
*
*/
IFoo fooObj = (IFoo) ctx.getBean("beanFoo"); String helloStr = fooObj.sayHello("Angle"); System.out.println(helloStr);
%>

JSP中使用Spring注入的Bean时需要注意的地方的更多相关文章

  1. 在Servlet中使用spring注入的bean

    package abu.csdn.servlet;    import java.io.IOException;    import javax.servlet.ServletContext;    ...

  2. jsp中获取spring 管理的bean(通过config)

    WebApplicationContext wac = (WebApplicationContext)config.getServletContext().getAttribute(WebApplic ...

  3. 如何在线程中获取spring 管理的bean

    转载自:https://my.oschina.net/skyline520/blog/181158?fromerr=GjtR6Wec spring xml中定义 <!--spring 工具类-- ...

  4. 如何在servlet的监听器中使用spring容器的bean

    另外补充下:在web Server容器中,无论是Servlet,Filter,还是Listener都不是Spring容器管理的,因此我们都无法在这些类中直接使用Spring注解的方式来注入我们需要的对 ...

  5. 170630、springboot编程之普通类中调用spring管理的bean对象

    我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接使用 ...

  6. SSH框架系列:Spring读取配置文件以及获取Spring注入的Bean

    分类: [java]2013-12-09 16:29 1020人阅读 评论(0) 收藏 举报 1.简介 在SSH框架下,假设我们将配置文件放在项目的src/datasource.properties路 ...

  7. jsf使用spring注入的bean

    jsf的后台bean中使用spring定义的service,需要使用@ManagedProperty,并且要具有该属性的getter/setter方法. package cn.catr.lm.idc. ...

  8. Servlet中获取Spring管理的bean

    描述: 在Servlet中调用Spring管理的接口,可以使Dao/Service/ServiceImpl. 前提是在调用的bean中有注解: @Repository("beanName&q ...

  9. 在Servlet中获取Spring注解的bean

    最近由于项目中出现了Servlet调用Spring的bean,由于整个项目中所有的bean均是注解方式完成,如@Service,@Repository,@Resource等,但是Spring的容器管理 ...

随机推荐

  1. svn -- svn安装与配置

    1.SVN分为服务器端与客户端 l 服务器端:VisualSVN   SubVersion l 客户端:TortoiseSVN server http://www.visualsvn.com/ cli ...

  2. HTTP之referer

    安全培训中提到可以通过referer判断安全性,hackbar中也有一个enable referer的选项,则,这个referer到底是个什么角色? (以下是搜集的一些资料整合,链接均放到底部,不再一 ...

  3. C# 获取web.config配置文件

    .ConfigurationManager提供对客户端应用程序配置文件的访问. 其有两个属性1.ConnectionStrings 获取当前应用程序默认配置的 ConnectionStringsSec ...

  4. zabbix 服务器设置邮件报警

    实验条件: Zabbix监控服务器.客户端都已经部署完成,被监控主机已添加完成,Zabbix监控运行正常. 实现目的: Zabbix监控服务器设置邮件报警,当被监控主机宕机或达到触发器预设值进,会自动 ...

  5. windows上開啟多個apache服務器

    1.安裝apache(這裡我用的是集成環境) 比較php版本 5.6  與 7.2 比較mysql版本 拓展: 注意:對個不同的版本的mysql,命令行進入,需要指明端口號,如:mysql -uroo ...

  6. Yii2.0 to(), toRoute(), current()区别用法

    [Url::current] - 现在测试本地路径(http://daxia.dc.weixin.com/mobile/hmConnections/user/verify-user) a: //获取当 ...

  7. LR URL编码和解码方法

    问题:URL=http://www.baidu.com/s?wd=%E6%B5%B7%E6%B7%80%E9%BB%84%E5%BA%84"中要对%E6%B5%B7%E6%B7%80%E9% ...

  8. BarTender数据中的转义符序列知识讲解

    Datamatrix是二维码的一个成员,广泛用于商品的防伪.统筹标识.如果为 Data Matrix 条形码指定的“符号类型”不是 ECC 200,则将会启用“字符集”选项.Data Matrix 也 ...

  9. MTK 预置apk

    一.如何将带源码的APK预置进系统? 1)     在 packages/apps 下面以需要预置的 APK的 名字创建一个新文件夹,以预置一个名为Test的APK 为例 2)     将 Test ...

  10. Postman模拟Request Payload发送请求

    Postman模拟Request Payload发送请求,如下图所示: