在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

springmvc多例模式失效

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

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

這里我用注解的方式對(duì)對(duì)象進(jìn)行注入,然后調(diào)用了3次select這個(gè)方法,然后調(diào)用輸出語句打印base對(duì)象的內(nèi)存地址,結(jié)果卻發(fā)現(xiàn)地址是一致的,這讓我覺得很驚奇,接下來是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>
        <!--默認(rèn)找的是web-info下的springmvc-xml配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!--Tomcat啟動(dòng)就實(shí)例化-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!--注意,/*連jsp頁面都會(huì)攔截,會(huì)全部攔截,不建議使用-->
    <!--強(qiáng)烈建議使用/,不會(huì)攔截靜態(tài)頁面-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

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

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

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

clipboard.png

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

clipboard.png

仍然不好使,對(duì)象的內(nèi)存地址一致,,,該如何解決?

回答
編輯回答
維他命

第一次回答:

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


第二次回答:

clipboard.png

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

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

不知你的@Autowiered在那個(gè)類里用的, 如果是在controller里, 關(guān)鍵在于controller是單例的, 里有的所有fields自然也都是單例的, 所以你那個(gè)bean怎么設(shè)都不會(huì)有啥影響.

EDITED

如果一定要做成多例的,可以參考
4.5.4.5 Scoped beans as dependencies
需要在配置beans時(shí)加上作用域代理

<!-- 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都新建一個(gè)實(shí)例嗎?如果這樣的話你應(yīng)該 scope="request".

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

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

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

是因?yàn)槟愕膕ervice是單例模式的.并不會(huì)因?yàn)槟愕恼{(diào)用次數(shù)而改變service里注入的成員變量!
你可以將service設(shè)置為多例模式,在service類上加注解 @Scope("prototype"),不過不建議你這么做,你就會(huì)發(fā)現(xiàn)base是不同的了

2018年5月5日 19:29