JSP中使用Spring注入的Bean时需要注意的地方
遇到问题
遇到一个问题:在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时需要注意的地方的更多相关文章
- 在Servlet中使用spring注入的bean
package abu.csdn.servlet; import java.io.IOException; import javax.servlet.ServletContext; ...
- jsp中获取spring 管理的bean(通过config)
WebApplicationContext wac = (WebApplicationContext)config.getServletContext().getAttribute(WebApplic ...
- 如何在线程中获取spring 管理的bean
转载自:https://my.oschina.net/skyline520/blog/181158?fromerr=GjtR6Wec spring xml中定义 <!--spring 工具类-- ...
- 如何在servlet的监听器中使用spring容器的bean
另外补充下:在web Server容器中,无论是Servlet,Filter,还是Listener都不是Spring容器管理的,因此我们都无法在这些类中直接使用Spring注解的方式来注入我们需要的对 ...
- 170630、springboot编程之普通类中调用spring管理的bean对象
我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接使用 ...
- SSH框架系列:Spring读取配置文件以及获取Spring注入的Bean
分类: [java]2013-12-09 16:29 1020人阅读 评论(0) 收藏 举报 1.简介 在SSH框架下,假设我们将配置文件放在项目的src/datasource.properties路 ...
- jsf使用spring注入的bean
jsf的后台bean中使用spring定义的service,需要使用@ManagedProperty,并且要具有该属性的getter/setter方法. package cn.catr.lm.idc. ...
- Servlet中获取Spring管理的bean
描述: 在Servlet中调用Spring管理的接口,可以使Dao/Service/ServiceImpl. 前提是在调用的bean中有注解: @Repository("beanName&q ...
- 在Servlet中获取Spring注解的bean
最近由于项目中出现了Servlet调用Spring的bean,由于整个项目中所有的bean均是注解方式完成,如@Service,@Repository,@Resource等,但是Spring的容器管理 ...
随机推荐
- 深度学习 Deep Learning UFLDL 最新Tutorial 学习笔记 5:Softmax Regression
Softmax Regression Tutorial地址:http://ufldl.stanford.edu/tutorial/supervised/SoftmaxRegression/ 从本节開始 ...
- GridView如何将分页数据全部导出为EXCEL?
GRIDVIEW分页状态下将全部数据导出 protected void Button2_Click(object sender, EventArgs e)//按button2将gridview将数据导 ...
- [转帖]CentOS下iRedMail安装配置
CentOS下iRedMail安装配置 中文名为艾瑞得邮件,由 rhms 项目更名而来.是针对 Linux 设计的邮件服务器解决方案,是在操作系统安装好后使用的一套 shell 脚本,用于快速部署一套 ...
- UNIX环境编程学习笔记(14)——文件I/O之临时文件
lienhua342014-10-01 ISO C 标准 I/O 库提供了个两个函数 tmpnam 和 tmpfile 以帮助创建临时文件, #include <stdio.h> char ...
- 【QT学习】QT事件处理机制
GUI应用程序由 事件驱动. 键盘.鼠标.拖放.滚动.绘屏.定时事件. connect
- symfony 事务提交
1. 添加数据 新建一个对象,给对象赋值 $em = $this->getDoctrine()->getManager(); //添加事物 $em->getConnection()- ...
- 关于测试中哪些信息需要放到jira上面
1.每个新需求的功能点,全部在jira上一一呈现 2.每个bug也一样在jira上一一呈现 3.任务一个需要优化改进的点也一一在jira上呈现 然后程序员一直开发新功能和修改新bug,测试人员负责bu ...
- python垃圾回收,判断内存占用,手动回收内存,二
以下为例子,判断计算机内存并释放程序内存. # coding=utf8 import time import psutil, gc, commands,os from logger_until imp ...
- linux 使用supervisor来管理进程
现在假设一个脚本是,hello.py,内容是 fo = open('xx.txt','w') while 1: fo.write('hello world') print('hi') time.sle ...
- [原]反编译unity3d发布apk
郑重声明:本教程仅用于学习使用,从事任何商业用途非法行为与作者无关,请知晓! 本文目的:通过教会大家如何破解别人游戏的同时,也希望各位开发者能加强自身游戏的防破解能力! 1:到gitHub下载DisU ...