Spring兩大核心
IOC(Inversion Of Controll,控制反轉(zhuǎn))
是一種設計思想,將原本在程序中手動創(chuàng)建對象的控制權,交由給Spring框架來管理。IOC容器是Spring用來實現(xiàn)IOC的載體,IOC容器實際上就是一個Map(key, value),Map中存放的是各種對象。
這樣可以很大程度上簡化應用的開發(fā),把應用從復雜的依賴關系中解放出來。IOC容器就像是一個工廠,當需要創(chuàng)建一個對象,只需要配置好配置文件/注解即可,不用考慮對象是如何被創(chuàng)建出來的,大大增加了項目的可維護性且降低了開發(fā)難度。
AOP(Aspect-Oriented Programming,面向切面編程)
面向切面編程:把重復的代碼抽取成為共性,當需要的時候再用
能夠?qū)⒛切┯跇I(yè)務無關,卻為業(yè)務模塊鎖共同調(diào)用的邏輯或責任封裝起來
便于減少系統(tǒng)的重復代碼,降低模塊間的耦合度,并有利于未來的可擴展性和維護性
Spring AOP / AspectJ AOP 的區(qū)別?
Spring AOP屬于運行時增強,而AspectJ是編譯時增強。
Spring AOP基于動態(tài)代理(Proxying),而AspectJ基于字節(jié)碼操作(Bytecode Manipulation)。
AspectJ相比于Spring AOP功能更加強大,但是Spring AOP相對來說更簡單。
如果切面比較少,那么兩者性能差異不大。但是,當切面太多的話,最好選擇AspectJ,它比SpringAOP快很多。
Spring優(yōu)勢:
方便解耦,
簡化開發(fā),
方便集成各種優(yōu)秀框架,
方便程序的測試,
AOP編程的支持,
聲明式事務的支持,
降低JavaEE API的使用難度,
Java源碼是經(jīng)典學習范例,
耦合與內(nèi)聚
耦合:模塊間的聯(lián)系
代碼書寫過程中所使用技術的結合緊密度
耦合性也稱塊間聯(lián)系。指軟件系統(tǒng)結構中各模塊間相互聯(lián)系緊密程度的一種度量。模塊之間聯(lián)系越緊密,其耦合性就越強,模塊的獨立性則越差。模塊間耦合高低取決于模塊間接口的復雜性、調(diào)用的方式及傳遞的信息。
由于衡量軟件中各個模塊之間的互聯(lián)程度,各個技術連接太緊密,拆不開;
耦合高:牽一發(fā)而動全身
內(nèi)聚:模塊內(nèi)的聯(lián)系
內(nèi)聚性又稱塊內(nèi)聯(lián)系。指模塊的功能強度的度量,即一個模塊內(nèi)部各個元素彼此結合的緊密程度的度量。若一個模塊內(nèi)各元素(語名之間、程序段之間)聯(lián)系的越緊密,則它的內(nèi)聚性就越高。
降低程序之間的耦合性
DI依賴注入
注入實際上就是給對象賦值
DI:dependency injection 依賴注入
spring容器中的A對象的運行需要使用spring容器中的B對象,稱為A依賴于B
讓spring將容器中的B對象賦值給A對象中的B變量的過程就稱之為依賴注入
注入的方式
1.set方法注入(set賦值)
- 構造方法注入(構造方法賦值)
- 注解注入(注解賦值)
Spring所依賴的jar包
<dependencies>
<!--mybatis的jar包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<!--連接數(shù)據(jù)庫jar包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--spring應用上下文jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!--spring中操作并整合jdbc的坐標-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!--druid連接池坐標-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<!--spring和mybatis進行整合的坐標-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
</dependencies>
Spring工作流程
- dao/mapper層接口編寫對應方法
- domain層下編寫封裝對象
- service層下編寫方法規(guī)范(接口),service-impl下實現(xiàn)該接口
- resourses建立和mapper層路徑一致的xml文件,由于編寫sql語句
- resourses下直接存放jdbc.properties,applicationContext.xml ………
applicationContext.xml內(nèi)容:
image.png
1. 加載外部properties文件 *表示為加載所有的properties文件 比如數(shù)據(jù)庫
2. 配置連接池
3. 配置serviceImpl,由于調(diào)用方法
4. 配置sqlSessionFactory的對象
5. 告知spring,dao層接口所在包
7, 測試方法,一般在測試包下建立
image.png
Spring整合junit
整合思路:
- spring提供了一個運行器,這個運行器在執(zhí)行時,能夠創(chuàng)建ioc容器
- 通過spring提供的運行器,替換junit自帶的核心運行器
- 為spring的運行器,指定容器的創(chuàng)建方式(加載xml配置文件,或加載配置類)
- 在測試類中使用依賴注入,注入需要使用的bean
整合步驟:
- 導入junit和spring整合的junit的jar包
- 在測試類上通過@RunWith注解替換junit自帶的運行器
- 在測試類上通過@ContextConfiguration注解,指定容器的創(chuàng)建方式
- 通過spring整合junit的坐標版本必須大于等于4.12,否則直接報錯
通過spring整合mybatis
- 編寫jdbcConfig配置類,用于加載jdbc配置文件,創(chuàng)建連接池
- 編寫mybatisConfig配置類,用于創(chuàng)建sqlsessionFactoryBean和mapperscnnerconfigurer
注意帶有@bean注解的方法可以添加參數(shù)進行傳遞 - 編寫主配置類springConfig配置組件掃描,并導入mybatisConfig配置類
- 在service實現(xiàn)類上添加注解
- 加載主配置類,創(chuàng)建注解容器進行測試

