spring总结(01)
Spring 是企業(yè)級應(yīng)用中的一個軟件開發(fā)框架(Framework),一個半成品。最大優(yōu)勢是更好實現(xiàn)資源的整合。例如整合JDBC,MyBatis,Hibernate等框架資源以更好的簡化應(yīng)用軟件開發(fā),降低軟件開發(fā)周期。
?
Spring?最初的目標(biāo)就是要整合一切優(yōu)秀資源,然后對外提供一個統(tǒng)一的服務(wù),其具體架構(gòu)(Spring 4.0)如下:
Spring?中的核心組件:
1)?IOC??組件(控制反轉(zhuǎn)容器):對象創(chuàng)建,對象存儲,對象依賴管理。
2)?DATA?組件(整合JDBC,MyBatis,JPA,....)
3)?MVC ?組件(重點解決與表示層通訊問題)
4)?AOP ?組件(重點解決對象功能擴展問題)
?
1.1.?Spring?IOC?概述
Spring?中有一個核心容器,這個容器我們通常稱之為IOC(Inversion of Control)容器,這個容器最核心功能就是控制反轉(zhuǎn).這個容器負責(zé)對象的創(chuàng)建,
對象的存儲(map),對象的管理(依賴查找,依賴注入)。
?
總結(jié):
1)?核心服務(wù)(整合資源)
2)?核心特性 (IOC-面向?qū)ο?/span>,AOP-面向切面,Cloud-面向微服務(wù))
3)?核心目的(更好的對系統(tǒng)進行粒度控制,對象管理,功能擴展)
?
1.?Spring?框架中Bean對象基礎(chǔ)應(yīng)用
?
在軟件應(yīng)用中由Spring管理的所有對象都稱之為Bean.我們自己創(chuàng)建的類假如需要由spring管理,首先對這個類進行配置,常用配置方式有兩種,一種基于xml進行配置,一種基于注解進行配置.
?
a.基于xml方式對象Bean對象進行配置時,首先需要在spring的核心配置文件中
使用bean標(biāo)簽對bean類型進行聲明,借助id或name屬性指定的bean的一個
標(biāo)識.通過class屬性指定bean的具體類型(必須寫全類名);
?
1.1.?Bean 對象的構(gòu)建
Spring?中Bean對象的構(gòu)建,提供了如下兩種方式:
1)?直接通過構(gòu)造方法
2)?通過工廠的實例方法(調(diào)用FactoryBean的getObject方法)
代碼實現(xiàn): 直接通過構(gòu)造函數(shù)
??????<!-- 直接通過類的構(gòu)建方法構(gòu)建對象(重點)?-->
??????<bean?id="helloService"?class="beans.HelloService"/>
1.1.?Bean 對象的作用域
在Spring容器中管理的Bean對象,可以在聲明時通過scope屬性或
相關(guān)注解指定其作用域,最常用是singleton,prototype.其含義如下
1)?singleton (這個作用域標(biāo)識的對象具備全局唯一性):系統(tǒng)默認
2)?prototype(這個作用域標(biāo)識的對象每次獲取都會創(chuàng)建新的對象)
?
?<bean?id="helloService"
????????????class="beans.HelloService"
????????????scope="singleton"/>
1.1.?Bean 對象的生命周期
在Spring框架應(yīng)用中,所有的的Bean對象都有生命周期,所謂Bean對象的生命周期是指Bean對象的創(chuàng)建,初始化,服務(wù),銷毀的這個過程.
???在spring配置文件中可以通過Init-method,destory-method屬性指定bean的生命周期方法.例如:
??<bean?id="helloService"
????????????class="beans.HelloService"
????????????scope="prototype"
? ? ? ? ? ?init-method="init"
? ? ? ? ?destroy-method="destory"/>
?
在Spring應(yīng)用由Spring創(chuàng)建的對象是否由spring銷毀,還取決于Bean對象的作用域的配置.例如
1)?singleton作用域的對象可以在容器關(guān)閉時銷毀(會調(diào)用對象的銷毀資源的方法)
2)?prototype作用域的對象可以由容器創(chuàng)建對象,初始化對象,但不負責(zé)銷毀.
一般是資源提供者對象,例如連接池對象可能會寫生命周期方法
?
Bean 對象的延遲加載
在spring框架應(yīng)用,容器初始化時候,默認會構(gòu)建所有由spring管理的Bean對象.但假如這些對象長時間不使用還占用著內(nèi)存就會造成一定的資源浪費.為了解決這個問題,spring中提供了一種延遲加載機制.通過這種機制來提高系統(tǒng)資源的有效使用.
Spring中的延遲加載需要通過bean元素中lazy-init屬性或beans元素的default-lazy-init="true"屬性進行設(shè)置.兩者應(yīng)用的不同點:
1)?lazy-init: 應(yīng)用在bean標(biāo)簽中用于指定這個bean的加載策略.
2)?default-lazy-init:應(yīng)用在beans標(biāo)簽中用于指定所有bean的加載策略.
例如:
<bean?id="helloService"?class="beans.HelloService"?scope="singleton"?lazy-init="true"/>
Spring?框架中依賴注(DI)基礎(chǔ)應(yīng)用
1.1.?直接量值的注入
Spring 直接量值的注入指的是通過Spring IOC為對象的8種封裝類以及String類型的屬性注入值。
?
配置OpenDataSource類并通過set方法為對象屬性賦值。
<bean?id="dataSource"?class="beans.OpenDataSource">
???????????<property?name="driverClassName"?value="com.jdbc.mysql.Driver"/>
???????????<property?name="url"?value="jdbc:mysql:///test"/>
???????????<property?name="username"?value="root"/>
???????????<property?name="password"?value="root"/>
</bean>
當(dāng)然假如對象提供了對應(yīng)的構(gòu)造方法也可以通過構(gòu)造方法為屬性注入值,例如
<bean?id="openDataSource02"?class="beans.OpenDataSource">
????????????<!-- 默認按照構(gòu)造方法參數(shù)順序注入值
???????????????????????說明:配置時有幾個constructor-arg就是
???????????????????????要調(diào)用帶及格參數(shù)的構(gòu)造函數(shù)
?????????????-->
????????????<constructor-arg?value="com.mysql.jdbc.Driver"/>
????????????<constructor-arg?value="jdbc:mysql:///test"/>
????????????<constructor-arg?value="root"/>
????????????<constructor-arg?value="123456"/>
</bean>
?
說明:依賴注入時可以將配置信息提取到properties文件中,然后通過spring表達式#{id.key}的方式提取數(shù)據(jù)。
?
在類路徑下定義一個configs.properties文件,內(nèi)容如下
?
jdbcDriver=?com.mysql.jdbc.Driver
jdbcUrl=?jdbc:mysql:///test
jdbcUser=?root
jdbcPassword=123456
?
在spring的配置文件中configs.properties文件
<util:properties?id="cfg"?location="classpath:configs.properties"/>
?
在bean中為屬性注入值時使用spring 表達式
?
<bean?id="dataSource"?class="beans.OpenDataSource">
???????????<property?name="driverClassName"?value="#{cfg.jdbcDriver}"/>
???????????<property?name="url"?value="#{cfg.jdbcUrl}"/>
???????????<property?name="username"?value="#{cfg.username}"/>
???????????<property?name="password"?value="#{cfg.password}"/>
</bean>
其中#為spring表達式特殊標(biāo)記,{}為表達式內(nèi)容,cfg為util:properties 標(biāo)簽中定義的id. username、password為配置文件等號左邊的key
?
Spring?配置文件中為對象屬性注入值。
<bean?id="collection"??class="beans.CollectionObject">
?????????<property?name="list">
????????????<list>
???????????????<value>A</value>
???????????????<value>B</value>
????????????</list>
?????????</property>
?????????<property?name="map">
????????????<map>
??????????????<entry?key="k1"?value="100"?/>
??????????????<entry?key="k2"?value="300"?/>
????????????</map>
?????????</property>
?????????<property?name="properties">
????????????<props>
???????????????<prop?key="username">root</prop>
???????????????<prop?key="password">123456</prop>
????????????</props>
?????????</property>
?????</bean>
?
類的設(shè)計
?
package?com.jt.common.utils;
/**生產(chǎn)者對象(負責(zé)向容器放數(shù)據(jù))*/
public?class?Producer {//IOC(工廠,容器)
/**生產(chǎn)者關(guān)聯(lián)一個容器對象(目的是要向此容器放數(shù)據(jù))*/
private?Container container;
public?void?setContainer(Container container) {
this.container?= container;
}
public?Container getContainer() {
return?container;
}
}
?
類的基本配置
?
…
<bean?id="producer"?class="com.jt.common.utils.Producer">
????????????<!-- 借助ref屬性從容器中獲取一個id為container
?????????????的對象然后賦值給Producer的container屬性 -->
????????????<property?name="Container"?ref="container"/>??????
</bean>
…
?
單元測試
?
public?class?TestProducer01 extends?TestBase{
@Test
public?void?testProducer(){
//1.獲取生產(chǎn)者對象
Producer pro=ctx.getBean("producer",Producer.class);
Assert.assertNotEquals(null, pro);
//2.獲取生產(chǎn)者關(guān)聯(lián)的容器對象
Container container=pro.getContainer();
Assert.assertNotEquals(null, container);
//3.向容器放數(shù)據(jù)
container.getMap().put("mysql", 100);
container.getList().add("皮皮霞");
}
}
轉(zhuǎn)載于:https://www.cnblogs.com/zj-xu/p/10830559.html
總結(jié)
以上是生活随笔為你收集整理的spring总结(01)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue中使用postMessage进行跨
- 下一篇: Java50道经典习题-程序18 乒乓球