鍍金池/ 問答/Java/ springmvc多例模式失效

springmvc多例模式失效

碰到了一個非常奇怪的問題,現例如下:
寫了一個項目,底層是用SSM框架搭建的,本來沒什么問題,但是用autowired注解注入的時候發(fā)現對象是單利的,而我想得到的對象是多例的,于是在spring里這樣進行了配置

clipboard.png
對,我覺得這樣配之后就是多例的了,然后用autowired進行對象注入
clipboard.png

這里我用注解的方式對對象進行注入,然后調用了3次select這個方法,然后調用輸出語句打印base對象的內存地址,結果卻發(fā)現地址是一致的,這讓我覺得很驚奇,接下來是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監(jiān)聽器-->
    <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頁面都會攔截,會全部攔截,不建議使用-->
    <!--強烈建議使用/,不會攔截靜態(tài)頁面-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

想了半天沒想明白是那里錯了問題,scope失效了還是說spring_mvc里的對象只能是單例的?求好心人解答,不勝感激

補充:看到解答里有人說設置類為多例的,于是打上了注解試了下,我是這么配的

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

clipboard.png

之后通過打印BaseDictExample的內存地址發(fā)現地址仍然是一樣的,我甚至把controller都打上注解了,類似于這樣

clipboard.png

仍然不好使,對象的內存地址一致,,,該如何解決?

回答
編輯回答
維他命

第一次回答:

指向的是一個地址,指向的是這個屬性的地址,你調用三次,難道你打印的不是這個地址嗎!明顯你訪問的是同一個屬性。。。。而且spring mvc 默認是單例模式


第二次回答:

clipboard.png

是否是這里加錯了,把這個刪除了試試,我沒有試過除了在controller加@scope("protetype"),而且我搜了一下百度,搜到的全是在controller加@scope("protetype"),所以你把這個刪除了試試看

2017年10月29日 22:44
編輯回答
心悲涼

不知你的@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...

2017年8月26日 20:29
編輯回答
擱淺

你想要的多例是需要每次request都新建一個實例嗎?如果這樣的話你應該 scope="request".

2018年7月1日 05:36
編輯回答
萌面人

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

2018年1月13日 20:20
編輯回答
朕略萌

是因為你的service是單例模式的.并不會因為你的調用次數而改變service里注入的成員變量!
你可以將service設置為多例模式,在service類上加注解 @Scope("prototype"),不過不建議你這么做,你就會發(fā)現base是不同的了

2018年5月5日 19:29