java元婴期(17)----java进阶(spring(1)----spring基本概念IOC)
1.spring是什么?
Spring是分層的Java SE/EE應(yīng)用 full-stack輕量級(jí)開源框架,以IoC(Inverse Of Control:反轉(zhuǎn)控制)和AOP(Aspect Oriented Programming:面向切面編程)為內(nèi)核,提供了展現(xiàn)層Spring MVC和持久層Spring JDBC以及業(yè)務(wù)層事務(wù)管理等眾多的企業(yè)級(jí)應(yīng)用技術(shù),還能整合開源世界眾多著名的第三方框架和類庫(kù),逐漸成為使用最多的Java EE企業(yè)應(yīng)用開源框架。
2.spring的優(yōu)勢(shì)
方便解耦,簡(jiǎn)化開發(fā)
通過(guò)Spring提供的IoC容器,可以將對(duì)象間的依賴關(guān)系交由Spring進(jìn)行控制,避免硬編碼所造成的過(guò)度程序耦合。用戶也不必再為單例模式類、屬性文件解析等這些很底層的需求編寫代碼,可以更專注于上層的應(yīng)用。
AOP編程的支持
通過(guò)Spring的AOP功能,方便進(jìn)行面向切面的編程,許多不容易用傳統(tǒng)OOP實(shí)現(xiàn)的功能可以通過(guò)AOP輕松應(yīng)付。
聲明式事務(wù)的支持
可以將我們從單調(diào)煩悶的事務(wù)管理代碼中解脫出來(lái),通過(guò)聲明式方式靈活的進(jìn)行事務(wù)的管理,提高開發(fā)效率和質(zhì)量。
方便程序的測(cè)試
可以用非容器依賴的編程方式進(jìn)行幾乎所有的測(cè)試工作,測(cè)試不再是昂貴的操作,而是隨手可做的事情。
方便集成各種優(yōu)秀框架
Spring可以降低各種框架的使用難度,提供了對(duì)各種優(yōu)秀框架(Struts、Hibernate、Hessian、Quartz等)的直接支持。
降低JavaEE API的使用難度
Spring對(duì)JavaEE API(如JDBC、JavaMail、遠(yuǎn)程調(diào)用等)進(jìn)行了薄薄的封裝層,使這些API的使用難度大為降低。
Java源碼是經(jīng)典學(xué)習(xí)范例
Spring的源代碼設(shè)計(jì)精妙、結(jié)構(gòu)清晰、匠心獨(dú)用,處處體現(xiàn)著大師對(duì)Java設(shè)計(jì)模式靈活運(yùn)用以及對(duì)Java技術(shù)的高深造詣。它的源代碼無(wú)意是Java技術(shù)的最佳實(shí)踐的范例。
3.什么是程序的耦合
程序的耦合度是 你的子程序之間的相關(guān)聯(lián)性,也就是說(shuō)你的多個(gè)類的聯(lián)系 是否太緊密,打個(gè)比方,你房子里邊有窗子 ,那房子 和窗子 就有了關(guān)聯(lián),耦合度是松還是緊 就看你的 關(guān)聯(lián) 是強(qiáng)還是弱,也就是修改的代價(jià),比如 你窗子是扣死在墻里的 那么你修改窗子 就必須修改墻 這就比較緊密了,但是如果你窗子是按照某種規(guī)格的 可以自由拆裝的 那么修改的代價(jià)就小,耦合度也就低了。我們寫程序的目標(biāo)就是 高內(nèi)聚 低耦合!這樣修改起來(lái) 就不會(huì)有太多的聯(lián)系 不用 改一個(gè)地方 其他的都要修改
4.工廠模式解耦
在實(shí)際開發(fā)中我們可以把三層的對(duì)象都使用配置文件配置起來(lái),當(dāng)啟動(dòng)服務(wù)器應(yīng)用加載的時(shí)候,讓一個(gè)類中的方法通過(guò)讀取配置文件,把這些對(duì)象創(chuàng)建出來(lái)并存起來(lái)。在接下來(lái)的使用的時(shí)候,直接拿過(guò)來(lái)用就好了。 那么,這個(gè)讀取配置文件,創(chuàng)建和獲取三層對(duì)象的類就是工廠。
原來(lái): 我們?cè)讷@取對(duì)象時(shí),都是采用new的方式。是主動(dòng)的。
? ? ?
現(xiàn)在: 我們獲取對(duì)象時(shí),同時(shí)跟工廠要,有工廠為我們查找或者創(chuàng)建對(duì)象。是被動(dòng)的。
? ?? ??
(重點(diǎn))5.IOC(控制反轉(zhuǎn))
(重點(diǎn)掌握)明確ioc的作用:
? ? ? ? 削減計(jì)算機(jī)程序的耦合(解除我們代碼中的依賴關(guān)系)。
?
6.使用spring的IOC削減程序耦合(只能削減,若是能消除的話,那說(shuō)明這兩個(gè)類中必定有一個(gè)是多余的)
1.打開idea創(chuàng)建maven項(xiàng)目
2.在pom文件中配置相應(yīng)的spring的jar包依賴
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.itheima</groupId><artifactId>day01_eesy_03spring</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency></dependencies> </project>3..在resources文件夾下新建一個(gè)名叫ApplicationContext的xml文件,并配置好約束(idea里可以直接右鍵創(chuàng)建spring的xml文件)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"></beans>4.創(chuàng)建完相關(guān)service,dao,ui層后(這里只是模擬三層架構(gòu))。開始利用spring的控制反轉(zhuǎn)來(lái)實(shí)現(xiàn)逐層的調(diào)用。ui調(diào)用service,service調(diào)用dao層
- 獲取核心容器對(duì)象
- 根據(jù)id獲取Bean對(duì)象
- 把對(duì)象的創(chuàng)建交給spring來(lái)管理
ApplicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--把對(duì)象的創(chuàng)建交給spring來(lái)管理--><bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"></bean><bean id="accountDao" class="com.itheima.dao.impl.AccountDaoImpl"></bean> </beans>7.spring中工廠類的結(jié)構(gòu)圖
??
1.BeanFactory 和ApplicationContext 的區(qū)別與聯(lián)系:
聯(lián)系:
- BeanFactory 才是Spring 容器中的頂層接口。
- ApplicationContext 是它的子接口。
BeanFactory 和ApplicationContext 的區(qū)別:
創(chuàng)建對(duì)象的時(shí)間點(diǎn)不一樣。
- ApplicationContext:只要一讀取配置文件,默認(rèn)情況下就會(huì)創(chuàng)建對(duì)象。
- BeanFactory:什么時(shí)候使用什么時(shí)候創(chuàng)建對(duì)象。
2.ApplicationContext 接口的實(shí)現(xiàn)類
ClassPathXmlApplicationContext:
它是從類的根路徑下加載配置文件 推薦使用這種
FileSystemXmlApplicationContext:
它是從磁盤路徑上加載配置文件,配置文件可以在磁盤的任意位置。
AnnotationConfigApplicationContext:
當(dāng)我們使用注解配置容器對(duì)象時(shí),需要使用此類來(lái)創(chuàng)建spring 容器。它用來(lái)讀取注解。
8.IOC中bean標(biāo)簽和管理對(duì)象細(xì)節(jié)
1.bean標(biāo)簽
作用:
用于配置對(duì)象讓spring來(lái)創(chuàng)建的。
默認(rèn)情況下它調(diào)用的是類中的無(wú)參構(gòu)造函數(shù)。如果沒(méi)有無(wú)參構(gòu)造函數(shù)則不能創(chuàng)建成功。
屬性:
id:給對(duì)象在容器中提供一個(gè)唯一標(biāo)識(shí)。用于獲取對(duì)象。
class:指定類的全限定類名。用于反射創(chuàng)建對(duì)象。默認(rèn)情況下調(diào)用無(wú)參構(gòu)造函數(shù)。
scope:指定對(duì)象的作用范圍。
- ?singleton :默認(rèn)值,單例的.
- ?prototype :多例的.
- ?request :WEB項(xiàng)目中,Spring創(chuàng)建一個(gè)Bean的對(duì)象,將對(duì)象存入到request域中.
- ?session :WEB項(xiàng)目中,Spring創(chuàng)建一個(gè)Bean的對(duì)象,將對(duì)象存入到session域中.
- ?global session :WEB項(xiàng)目中,應(yīng)用在Portlet環(huán)境.如果沒(méi)有Portlet環(huán)境那么globalSession相當(dāng)于session.
init-method:指定類中的初始化方法名稱。
destroy-method:指定類中銷毀方法名稱。
2.bean的作用范圍和生命周期
單例對(duì)象:scope="singleton"
一個(gè)應(yīng)用只有一個(gè)對(duì)象的實(shí)例。它的作用范圍就是整個(gè)引用。
生命周期:
- 對(duì)象出生:當(dāng)應(yīng)用加載,創(chuàng)建容器時(shí),對(duì)象就被創(chuàng)建了。
- 對(duì)象活著:只要容器在,對(duì)象一直活著。
- 對(duì)象死亡:當(dāng)應(yīng)用卸載,銷毀容器時(shí),對(duì)象就被銷毀了。
多例對(duì)象:scope="prototype"
每次訪問(wèn)對(duì)象時(shí),都會(huì)重新創(chuàng)建對(duì)象實(shí)例。
生命周期:
- 對(duì)象出生:當(dāng)使用對(duì)象時(shí),創(chuàng)建新的對(duì)象實(shí)例。
- 對(duì)象活著:只要對(duì)象在使用中,就一直活著。
- 對(duì)象死亡:當(dāng)對(duì)象長(zhǎng)時(shí)間不用時(shí),被java的垃圾回收器回收了。
3.實(shí)例化Bean的三種方式
第一種方式:使用默認(rèn)無(wú)參構(gòu)造函數(shù)
<!--在默認(rèn)情況下: 它會(huì)根據(jù)默認(rèn)無(wú)參構(gòu)造函數(shù)來(lái)創(chuàng)建類對(duì)象。如果bean中沒(méi)有默認(rèn)無(wú)參構(gòu)造函數(shù),將會(huì)創(chuàng)建失敗。--><bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"/>第二種方式:spring管理靜態(tài)工廠-使用靜態(tài)工廠的方法創(chuàng)建對(duì)象
/** * 模擬一個(gè)靜態(tài)工廠,創(chuàng)建業(yè)務(wù)層實(shí)現(xiàn)類 */public class StaticFactory { public static IAccountService createAccountService(){ return new AccountServiceImpl();} } <!-- 此種方式是: 使用StaticFactory類中的靜態(tài)方法createAccountService創(chuàng)建對(duì)象,并存入spring容器 id屬性:指定bean的id,用于從容器中獲取 class屬性:指定靜態(tài)工廠的全限定類名 factory-method屬性:指定生產(chǎn)對(duì)象的靜態(tài)方法 --><bean id="accountService" class="com.itheima.factory.StaticFactory" factory-method="createAccountService"></bean>第三種方式:spring管理實(shí)例工廠-使用實(shí)例工廠的方法創(chuàng)建對(duì)象
/** * 模擬一個(gè)實(shí)例工廠,創(chuàng)建業(yè)務(wù)層實(shí)現(xiàn)類 * 此工廠創(chuàng)建對(duì)象,必須現(xiàn)有工廠實(shí)例對(duì)象,再調(diào)用方法 */public class InstanceFactory { public IAccountService createAccountService(){return new AccountServiceImpl();}} <!-- 此種方式是: 先把工廠的創(chuàng)建交給spring來(lái)管理。 然后在使用工廠的bean來(lái)調(diào)用里面的方法 factory-bean屬性:用于指定實(shí)例工廠bean的id。 factory-method屬性:用于指定實(shí)例工廠中創(chuàng)建對(duì)象的方法。 --><bean id="instancFactory" class="com.itheima.factory.InstanceFactory"></bean> <bean id="accountService" factory-bean="instancFactory" factory-method="createAccountService"></bean>?
總結(jié)
以上是生活随笔為你收集整理的java元婴期(17)----java进阶(spring(1)----spring基本概念IOC)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java结丹期(16)----javaw
- 下一篇: java元婴期(18)----java进