springmvc多例模式失效

碰到了一个非常奇怪的问题,现例如下:
写了一个项目,底层是用SSM框架搭建的,本来没什么问题,但是用autowired注解注入的时候发现对象是单利的,而我想得到的对象是多例的,于是在spring里这样进行了配置

clipboard.png
对,我觉得这样配之后就是多例的了,然后用autowired进行对象注入
clipboard.png

这里我用注解的方式对对象进行注入,然后调用了3次select这个方法,然后调用输出语句打印base对象的内存地址,结果却发现地址是一致的,这让我觉得很惊奇,接下来是spring的配置

clipboard.png

spring_mvc的配置

clipboard.png

web.xml的配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <!--spring监听器-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 处理POST提交乱码问题 -->
    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>*.action</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--默认找的是web-info下的springmvc-xml配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!--Tomcat启动就实例化-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!--注意,/*连jsp页面都会拦截,会全部拦截,不建议使用-->
    <!--强烈建议使用/,不会拦截静态页面-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

想了半天没想明白是那里错了问题,scope失效了还是说spring_mvc里的对象只能是单例的?求好心人解答,不胜感激

补充:看到解答里有人说设置类为多例的,于是打上了注解试了下,我是这么配的

clipboard.png
然后我在BaseDict类里配置了多例注解

clipboard.png

之后通过打印BaseDictExample的内存地址发现地址仍然是一样的,我甚至把controller都打上注解了,类似于这样

clipboard.png

仍然不好使,对象的内存地址一致,,,该如何解决?

阅读 4.3k
5 个回答

不知你的@Autowiered在那个类里用的, 如果是在controller里, 关键在于controller是单例的, 里有的所有fields自然也都是单例的, 所以你那个bean怎么设都不会有啥影响.

EDITED

如果一定要做成多例的,可以参考
4.5.4.5 Scoped beans as dependencies
需要在配置beans时加上作用域代理

<!-- an HTTP Session-scoped bean exposed as a proxy -->
<bean id="baseDictExample" class="com.foo.BaseDictExample" scope="session">

    <!-- instructs the container to proxy the surrounding bean -->
    <aop:scoped-proxy/>
</bean>

https://stackoverflow.com/que...

是因为你的service是单例模式的.并不会因为你的调用次数而改变service里注入的成员变量!
你可以将service设置为多例模式,在service类上加注解 @Scope("prototype"),不过不建议你这么做,你就会发现base是不同的了

你想要的多例是需要每次request都新建一个实例吗?如果这样的话你应该 scope="request".

第一次回答:

指向的是一个地址,指向的是这个属性的地址,你调用三次,难道你打印的不是这个地址吗!明显你访问的是同一个属性。。。。而且spring mvc 默认是单例模式


第二次回答:

clipboard.png

是否是这里加错了,把这个删除了试试,我没有试过除了在controller加@scope("protetype"),而且我搜了一下百度,搜到的全是在controller加@scope("protetype"),所以你把这个删除了试试看

在使用@Autowiered注入BaseDictExample的类上加上@Scope("prototype")即可

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题