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