Spring學習筆記(一)-概念與IOC-基於xml
Spring學習筆記(一)-概念與IOC-基於xml
概念
- 輕量級java開發框架,核心是IOC(控制反轉)與AOP(面向切面程式設計)
- 作用是為了解耦,物件解耦,模組解耦,只能降低耦合
- 容器,放置java物件
- tomcat也是容器:管理Servlet,filter,listener
- web.xml檔案配置容器
- 面向介面:
- 物件關係從程式碼轉移到配置檔案,容器中,便於開發,提高靈活性
IOC
-
不在自己維護業務關係,交由Spring容器統一管理,包含放入容器與注入,物件之間的依賴關係,建立,物件的生命週期由Spring管理
-
控制:物件建立,屬性賦值,物件生命週期管理
-
反轉:由容器管理物件許可權
-
正轉:開發人員,使用new構造方法建立物件,掌握物件建立到銷燬的全部過程
-
實現:
- DI(依賴注入)Dependency Injection,是IOC的技術實現,程式只需要使用物件,物件的建立,查詢由容器內部實現
- 依賴:ClassA使用了ClassB的屬性或者方法,只能降低,不能消除
-
通過Spring框架只需要提供要使用的物件名詞即可從容器中獲取名稱對應的物件,Spring底層使用反射機制建立物件
-
//傳統物件建立 SomeService service = new SomeServiceImpl();
Spring IOC使用
-
Maven配置
-
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.1</version> </dependency>
-
Spring核心檔案配置
-
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.km"/> </beans>
Bean
-
bean標籤就是java物件,spring管理d額java物件就是bean
-
在bean標籤中的屬性:
- class:讓spring管理的類的全限定名稱,不能是介面
- id自定義的名稱,唯一
- spring管理的容器是一個Map,放入容器就是放入Map
-
建立容器物件:ApplicationContext,表示一個Spring容器
-
//從類路徑下的bean.xml檔案讀取配置,建立容器 ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml"); //獲取物件,使用getBean(id) AccountServiceImpl accountService = ac.getBean("accountService", AccountServiceImpl.class);
Spring容器的特點
- Spring預設使用無參構造方法,在預設設定下,沒有無參構造方法會導致物件例項化異常
- Spring建立物件的時機:預設情況下,在建立容器時就會建立檔案宣告的所有java物件:
- 優點:建立物件速度快
- 缺點:佔用記憶體高
-
- id作為key,物件作為value
- 可以通過Spring容器物件獲取容器中物件的資訊
DI
-
Spring呼叫類的無參構造方法建立物件,物件建立後給予屬性賦值
-
屬性賦值的方法:1.xml配置檔案中的標籤和屬性;2.註解
-
DI分類:1.設定注入set;2.構造注入
基於xml的DI
set注入:
-
設值注入,Spring呼叫類中的set方法完成屬性賦值,必須要有set方法
-
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <property name="url" value="${jdbc.url}"/> <property name="initialSize" value="${jdbc.initialSize}"/> <property name="maxActive" value="${jdbc.maxActive}"/> <property name="maxWait" value="${jdbc.maxWait}"/> </bean>
-
先呼叫無參構造方法,再完成屬性賦值,Spring此時只調用set方法,對於其他內容並不關心,只要有set的方法就可以使用set注入
-
set的引用型別的注入:
-
<property name="username" ref="引用型別bean的id"/>
-
構造注入:
-
Spring呼叫的類中有引數構造方法,在建立物件的同時給屬性賦值
-
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <constructor-arg name="fairLock" value="true"/> </bean>
-
constructor-arg 標籤的屬性:
- name:構造方法的形參名
- index:構造方法的形參屬性,基於位置,0開始
- value:簡單型別賦值
- ref:引用型別賦值
-
constructor-arg標籤的位置順序也可以構成引數賦值的要素,可以因此省略index
引用型別的自動注入:
-
Spring可以根據一定規則給引用型別完成賦值,只針對引用型別有效
-
byName(按名稱注入):需要注入的類的屬性名稱與bean的id對應,前提是型別一致
-
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> ... ... </bean> <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" autowire="byName"> <!--此set注入可以省略--> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:MybatisSpringConfig.xml"/> </bean>
-
-
byType(按型別注入):需要注入類中的屬性的型別與bean的class對應(介面、繼承)
- Spring會自動比較所需的型別和容器所管理的所有型別,自動注入
-
在有多個型別匹配時要解決衝突,byType時只能保留一個匹配的型別
-
多個配置檔案的使用
-
按功能模組分(登入、註冊... ...),按類的功能分(資料庫操作、service......)
-
使用import標籤:
-
<import resource="其他配置檔案的路徑"/>
-
-
萬用字元:
-
<import resource="Spring-*.xml"/>
-
將載入所有Spring-開始的檔案
-
注意不能包含自身
-