Spring和MyBatis高級(jí)應(yīng)用
Spring&MyBatis DAY01
Spring簡(jiǎn)介
什么是Spring
- Spring是一個(gè)開源的輕量級(jí)的應(yīng)用開發(fā)框架问裕,其目的是用于簡(jiǎn)化企業(yè)級(jí)應(yīng)用程序開發(fā),降低侵入性孵坚;
- Spring提供的IOC和AOP功能,可以將組件的耦合度降至最低粮宛,即解耦窥淆,便于系統(tǒng)日后的維護(hù)和升級(jí);
- Spring為系統(tǒng)提供了一個(gè)整體的解決方案,開發(fā)者可以利用它本身提供的功能外巍杈,也可以與第三方框架和技術(shù)整合應(yīng)用忧饭,可以自由選擇采用哪種技術(shù)進(jìn)行開發(fā)。
為什么要用Spring筷畦?
Spring的本質(zhì)是管理軟件中的對(duì)象词裤,即創(chuàng)建對(duì)象和維護(hù)對(duì)象之間的關(guān)系
Spring的主要功能
簡(jiǎn)介
Spring容器簡(jiǎn)介
- 在Spring中,任何的Java類和JavaBean都被當(dāng)成Bean處理鳖宾,這些Bean通過容器管理和使用吼砂。
- Spring容器實(shí)現(xiàn)了IOC和AOP機(jī)制,這些機(jī)制可以簡(jiǎn)化Bean對(duì)象創(chuàng)建和Bean對(duì)象之間的解耦;
- Spring容器有BeanFactory和ApplicationContext兩種類型;
什么是JavaBean:一種簡(jiǎn)單規(guī)范的Java對(duì)象
何時(shí)使用Spring鼎文?
當(dāng)需要管理JavaBean對(duì)象時(shí)候就可以使用渔肩,Spring是最簡(jiǎn)潔
的對(duì)象管理方案之一.
如何創(chuàng)建對(duì)象 如何管理對(duì)象之間關(guān)系
Spring容器的實(shí)例化&如何創(chuàng)建對(duì)象
-
ApplicationContext繼承自BeanFactory接口,擁有更多的企業(yè)級(jí)方法,推薦使用該類型拇惋,實(shí)例化方法如下:
//加載工程classpath下的配置文件實(shí)例化 String conf = "applicationContext.xml"; ApplicationContext ac = new ClassPathXmlApplicationContext(conf);
ClassPath是指WEB-INF目錄下的classes文件夾
如何使用Spring赖瞒?遵循Spring定義的規(guī)則,基于配置和默認(rèn)規(guī)則蚤假,減少了代碼的書寫
Spring容器的使用
- 從本質(zhì)上講,BeanFactory和ApplicationContext僅僅只是一個(gè)維護(hù)Bean定義以及相互依賴關(guān)系的高級(jí)工廠接口。通過BeanFactory和ApplicationContext我們可以訪問bean定義吧兔。
首先在容器配置文件applicationContext.xml中添加Bean定義
<bean id=“標(biāo)示符” class="Bean類型"/>-
然后在創(chuàng)建BeanFactory和ApplicationContext容器對(duì)象后磷仰,調(diào)用getBean()方法獲取Bean的實(shí)例即可
getBean("標(biāo)示符")
課堂練習(xí)
實(shí)例化Spring容器
使用ApplicationContext的方式實(shí)例化Spring容器
容器對(duì)Bean的管理
Bean的實(shí)例化
-
Spring容器創(chuàng)建Bean對(duì)象的方法有以下3種
- 用構(gòu)造器來實(shí)例化 重點(diǎn)
- 使用靜態(tài)工廠方法實(shí)例化 了解
- 使用實(shí)例工廠方法實(shí)例化 了解
將對(duì)象創(chuàng)建規(guī)則告訴Spring,Spring會(huì)幫你去創(chuàng)建對(duì)象;
基于配置和默認(rèn)規(guī)則,減少了代碼的書寫!
Bean的實(shí)例化
-
用構(gòu)造器來實(shí)例化
<bean id="" class="java.util.GregorianCalendat"/> <bean name="calendarObj2" class="java.util.GregorianCalendar"/>
id或name屬性用于指定Bean名稱,用于從Spring中查找這個(gè)Bean對(duì)象
class用于指定Bean類型境蔼,會(huì)自動(dòng)調(diào)用無參數(shù)構(gòu)造器創(chuàng)建對(duì)象
-
使用靜態(tài)工廠方法實(shí)例化
<bean id="calendarObj2" class="java.util.Calendar" factory-method="getInstance"/>
id屬性用于指定Bean名稱灶平;
class屬性用于指定工廠類型;
factory-method屬性用于指定工廠中創(chuàng)建Bean對(duì)象的方法箍土,必須用static修飾的方法逢享。 使用實(shí)例工廠方法實(shí)例化
id用于指定Bean名稱;
factory-bean屬性用于指定工廠Bean對(duì)象吴藻;
factory-method屬性用于指定工廠中創(chuàng)建Bean對(duì)象的方法
課堂練習(xí)
使用Spring容器創(chuàng)建bean
演示如何使用Spring容器創(chuàng)建bean.
Bean的命名 了解
-
Bean的名稱
- 在Spring容器中瞒爬,每個(gè)Bean都需要有名字(即標(biāo)示符),該名字可以用<bean>元素的id或name屬性指定
-
Bean的別名
為已定義好的Bean,再增加另外一個(gè)名字引用,可以<alias>指定
<alias name="fromName" alias="toName"/>
Bean的作用域
- Spring容器在實(shí)例化Bean時(shí)沟堡,可以創(chuàng)建以下作用域的Bean對(duì)象
作用域 | 描述 |
---|---|
singleton | 在每個(gè)Spring IoC容器中一個(gè)bean定義對(duì)應(yīng)一個(gè)對(duì)象實(shí)例侧但,默認(rèn)項(xiàng) |
prototype | 一個(gè)bean定義對(duì)應(yīng)多個(gè)對(duì)象實(shí)例 |
request | 在一次HTTP請(qǐng)求中,一個(gè)bean定義對(duì)應(yīng)一個(gè)實(shí)例航罗,僅限于Web環(huán)境 |
session | 在一個(gè)HTTP Session中禀横,一個(gè)bean定義對(duì)應(yīng)一個(gè)實(shí)例,僅限于Web環(huán)境 |
global Session | 在一個(gè)全局的HTTP Session中粥血,一個(gè)bean定義對(duì)應(yīng)一個(gè)實(shí)例;僅在基于portlet的Web應(yīng)用中才有意義柏锄,Portlet規(guī)范定義了全局Session的概念 |
上面的Bean作用域酿箭,可以通過<bean>定義的scope屬性指定
Bean的生命周期回調(diào)
-
指定初始化回調(diào)方法
<bean id="exampleBean" class="com.foo.ExampleBean" init-method="init"> </bean>
-
指定銷毀回調(diào)方法,僅適用于singleton模式的bean
<bean id="exampleBean" class="com.foo.ExampleBean" destroy-method="destroy"> </bean>
提示:指定銷毀回調(diào)方法趾娃,僅適用于singlton模式的bean
Spring會(huì)管理對(duì)象的創(chuàng)建過程
-
在頂級(jí)的<beans/>元素的default-init-method屬性缭嫡,可以為容器所有<bean>指定初始化回調(diào)方法
<beans default-init-method="init"> <bean id="exampleBean" class="com.foo.ExampleBean"/> </beans>
-
在頂級(jí)的<beans/>元素中的default-destroy-method屬性,可以為容器所有<bean>指示銷毀回調(diào)方法
<beans defaule-destory-method="sestroy"> <bean id="exampleBean" class="com.foo.ExampleBean"/> </beans>
Bean延遲實(shí)例化
在ApplicationContext實(shí)現(xiàn)的默認(rèn)行為就是在啟動(dòng)時(shí)將所有singleton bean提前進(jìn)行實(shí)例化
如果不想讓一個(gè)singleton bean在ApplicationContext初始化時(shí)被提前實(shí)例化茫舶,可以使用<bean>元素的lazy-init="true"屬性改變
-
一個(gè)延遲初始化bean將在第一次被用到時(shí)實(shí)例化
<bean id="exampleBean" lazy-init="true" class=“comm.foo.ExampleBean”>
-
在頂級(jí)的<beans/>元素中的default-lazy-init屬性,可以為容器所有<bean>指定延遲實(shí)例化特性
適用于使用頻率很低的單例對(duì)象
IOC簡(jiǎn)介
- IoC全稱是Inversion of Control,被譯為控制反轉(zhuǎn);
- IoC是指程序中對(duì)象的獲取方式發(fā)生反轉(zhuǎn)械巡,由最初的new方式創(chuàng)建,轉(zhuǎn)變?yōu)橛傻谌娇蚣軇?chuàng)建饶氏、注入(DI)讥耗,它降低了對(duì)象之間的耦合度。
Spring容器是采用DI方式實(shí)現(xiàn)了IOC控制疹启,IOC是Spring框架的基礎(chǔ)和核心;
DI全稱是Dependency Injection,被譯為依賴注入古程;
DI的基本原理就是將一起工作具有關(guān)系的對(duì)象,通過構(gòu)造方法參數(shù)或方法參數(shù)傳入建立關(guān)聯(lián)喊崖,因此容器的工作就是創(chuàng)建bean時(shí)注入那些依賴關(guān)系挣磨。
IOC是一種思想,而DI是實(shí)現(xiàn)IOC的主要技術(shù)途徑
DI主要有兩種注入方式荤懂,即Setter注入和構(gòu)造器注入
IOC應(yīng)用
Setter注入
-
通過調(diào)用無參構(gòu)造器或無參static工廠方法實(shí)例化bean之后茁裙,調(diào)用該bean的setter方法,即可實(shí)現(xiàn)setter方式的注入节仿。
public class Computer implements Serializable{ private String mainboard;//主板 public String getMainboard(){ return mainboard; } public void setMainboard(String mainboard){ this.mainboard=mainboard; } //其他代碼 }
-
在容器xml配置中晤锥,配置注入?yún)?shù)。
<bean id="computer" class="com.tarena.bean.Computer"> <property name="mainboard" value="技嘉"/> <property name="hdd" value="希捷"/> <property name="ram" value="金式頓"/> </bean>
構(gòu)造器注入
-
基于構(gòu)造器的注入是通過調(diào)用帶參數(shù)的構(gòu)造器來實(shí)現(xiàn)的廊宪,容器在bean被實(shí)例化的時(shí)候矾瘾,根據(jù)參數(shù)類型執(zhí)行相應(yīng)的構(gòu)造器。
public class MobilePhone implements Serializable{ private String cpu; private String ram; public MobilePhone(String cpu,String ram){ this.cpu = cpu; this.ram = ram; } }
構(gòu)造器注入箭启,可以強(qiáng)制給bean注入某些參數(shù)壕翩,比Setter注入更嚴(yán)格
-
按構(gòu)造參數(shù)索引指定注入
<bean id="phone" class="com.tarena.bean.MobilePhone"> <constructor-arg index="0" value="ARM"/> <constructor-arg index="1" value="2G"/> </bean>
自動(dòng)裝配 了解
- Spring IoC容器可以自動(dòng)裝配(autowire)相互協(xié)作bean之間的關(guān)聯(lián)關(guān)系,autowire可以針對(duì)單個(gè)bean進(jìn)行設(shè)置傅寡,autowire的方便之處在于減少xml的注入配置
- 在xml配置文件中放妈,可以在<bean/>元素中使用autowire屬性指定自動(dòng)裝配規(guī)則,一共有五種類型值
屬性值 | 描述 |
---|---|
no | 禁用自動(dòng)裝配赏僧,默認(rèn)值 |
byName | 根據(jù)屬性名自動(dòng)裝配大猛。此項(xiàng)將檢查容器并根據(jù)名字查找與屬性完全一致的bean,并將其與屬性自動(dòng)裝配 |
byType | 如果容器中存在一個(gè)與指定屬性類型相同的bean,那么將與該屬性自動(dòng)裝配 |
constructor | 與byType的方式類似淀零,不同之處在于它應(yīng)用于構(gòu)造器參數(shù) |
autodetect | 通過bean類來決定是使用constructor還是byType方式進(jìn)行自動(dòng)裝配挽绩。如果發(fā)現(xiàn)默認(rèn)的構(gòu)造器,那么將使用byType方式 |
-
配置示例
<bean id="computer" class="com.tarena.bean.Computer"> <property name="mainboard" value="技嘉"/> <property name="hdd" value="希捷"/> <property name="ram" value="金士頓"/> </bean> <bean id="phone" class="com.tarena.bean.MobilePhoe"> <constructor-arg index="0" value="ARM"> <constructor-arg index="1" value="2G"> </bean> <bean id="student" class="com.tarena.bean.Student" autowire="byType"> </bean>