javascript
SpringIOC的创建对象的单例多例模式和自动注入
[1] SpringIOC創(chuàng)建對(duì)象的單例和多例模式
問(wèn)題:
Spring容器對(duì)象根據(jù)配置文件創(chuàng)建對(duì)象的時(shí)機(jī)默認(rèn)發(fā)生在Spring容器對(duì)象在被創(chuàng)建的時(shí)候,也就是說(shuō),我們一旦獲取到Spring容器對(duì)象,意味著可以直接獲取Spring容器中的對(duì)象使用了.那么,如果我對(duì)同一個(gè)bean對(duì)象,連續(xù)獲取N次,獲取到的是不是同一個(gè)對(duì)象呢?因?yàn)閟pring容器對(duì)象底層使用的是map集合存儲(chǔ)的bean對(duì)象,對(duì)map集合按照同一個(gè)鍵名獲取數(shù)據(jù),獲取的是同一個(gè),也就說(shuō)按照同一個(gè)鍵名從Spring容器中獲取的都是同一個(gè)對(duì)象,那么如果我們希望相同的鍵名獲取的對(duì)象每次都不一樣,怎么實(shí)現(xiàn)?
解決:
不要在Spring容器對(duì)象創(chuàng)建的時(shí)候,就完成對(duì)象的初始化創(chuàng)建,而是變?yōu)?從Spring容器中獲取的時(shí)候才創(chuàng)建,每次獲取都重新創(chuàng)建.
實(shí)現(xiàn):
Spring容器的單例和多例模式創(chuàng)建對(duì)象. 單例模式(默認(rèn)):
設(shè)置了單例模式的bean,會(huì)在Spring容器對(duì)象被創(chuàng)建的時(shí)候 就完成初始化創(chuàng)建,無(wú)論獲取多少次都是同一個(gè)對(duì)象. 多例模式:
設(shè)置了多例模式的bean,在Spring容器對(duì)象被創(chuàng)建的時(shí)候不會(huì)被初 始化創(chuàng)建,每次獲取的時(shí)候都會(huì)重新創(chuàng)建,每次獲取的對(duì)象都不相同.
使用:
applicationcontext.xml: <?xml version="1.0" encoding="UTF-8"?> <beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--SpringIOC設(shè)置對(duì)象的單例模式和多例模式創(chuàng)建對(duì)象單例模式:默認(rèn)模式,在bean標(biāo)簽上使用scope屬性,默認(rèn)值為singleton多例模式:在bean標(biāo)簽上使用scope屬性設(shè)置,值為prototype--><bean id="stu" class="com.java.pojo.Student" scope="singleton"></bean><bean id="tea" class="com.java.pojo.Teacher" scope="prototype"></bean> </beans>TestIocModel package com.java.controller; import com.java.pojo.User; import com.java.service.UserService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.request.async.WebAsyncUtils; import org.springframework.web.context.support.WebApplicationContextUtils; import javax.rmi.CORBA.StubDelegate; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;@WebServlet(value = "/user", loadOnStartup = 1) public class UserServlet extends HttpServlet {public static void main(String[] args) {//獲取Spring容器對(duì)象ApplicationContext ac = new ClassPathXmlApplicationContext("applicationcontext.xml");Student stu =(Student) ac.getBean("stu");Student stu2 =(Student) ac.getBean("stu");Teacher teacher = (Teacher) ac.getBean("stu");Teacher teacher2 = (Teacher) ac.getBean("stu");System.out.println("學(xué)生:"+(stu==stu2));System.out.println("教室:"+(teacher==teacher2));} }[2] SpringIOC的自動(dòng)注入
問(wèn)題:
在學(xué)習(xí)了SpringIOC的DI依賴(lài)注入后,我們可以根據(jù)對(duì)象之間的依賴(lài)關(guān)系的 責(zé)任鏈,讓Spring容器對(duì)象幫我們創(chuàng)建有一個(gè)組裝好的對(duì)象,比如A中有B,B 中有C,C中有D.將A,B
,C,D都創(chuàng)建為Bean對(duì)象,然后使用ref屬性告訴Spring 對(duì)象之間的依賴(lài)關(guān)系的組裝規(guī)則,假如依賴(lài)責(zé)任鏈特別長(zhǎng),使用ref注入就會(huì)很 麻煩.怎么辦?
解決:
不要聲明ref屬性來(lái)指明依賴(lài)關(guān)系的注入,只需要告訴Spring容器對(duì)象依賴(lài)關(guān) 系的注入規(guī)則,Spring容器對(duì)象自動(dòng)根據(jù)規(guī)則完成依賴(lài)關(guān)系的注入.
實(shí)現(xiàn):
①根據(jù)bean的ID和屬性名一致的規(guī)則
②根據(jù)bean的類(lèi)型和屬性的類(lèi)型一致的規(guī)則
③根據(jù)構(gòu)造器形參的類(lèi)型和bean的類(lèi)型一致的規(guī)則
④不能使用自動(dòng)注入,只能手動(dòng)聲明
⑤使用默認(rèn)規(guī)則
總結(jié)
以上是生活随笔為你收集整理的SpringIOC的创建对象的单例多例模式和自动注入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 设计师电脑用什么cpu?
- 下一篇: SpringAOP的SchemaBase