• 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 %>
  • 相关阅读:
    8.8全民健身日,扒一扒音视频互动与健身的那些事儿
    游戏视频开发平台的特点
    音视频开发技术之自主集成第三方编解码器
    视频开发之外部音视频输入
    视频开发技术之文件传输限速
    视频开发技术之文件传输
    ubuntu16.04LTS+pycharm kuaijiefangshi
    install cuda
    Tensorflow实现MNIST
    TensorFlow导入mnist数据集
  • 原文地址:https://www.cnblogs.com/memory4young/p/jsp-spring-bean-should-use-interface.html
Copyright © 2020-2023  润新知