1.Spring 框架的組成 ***
IOC 控制反轉 是構成Spring框架的核心
DAO Spring 對 JDBC 封裝之後訪問數據庫的支持
WebMVC Spring 對 web 技術和 MVC 設計模式的支持以及其它的web框架的支持 Struts2
AOP 面向切面編程
ORM 對象關係映射框架 Mybatis
JEE 與JavaEE服務整合
2.什麼是IOC ***
Inversion Of Control 控制反轉
程序中需要某些對象時 由原來的new的方式 變成了由容器 來進行對象的創建 管理 以及維護組件之間的關係
這樣做到的好處 可以大大降低組件之間的耦合度。
3.Spring 容器 ***
1.任何的java類 都可以在Spring 容器中創建對象 並由容器管理和使用
2.Spring 容器實現IOC 和 AOP 機制
3.Spring 容器的類型 是BeanFactory 或者 ApplicationContext 類型
4.使用Spring 容器 實現 IOC 的步驟(寫熟)***
4.1 建立一個項目 導入jar包(IOC相關) 並拷貝Spring容器對應的配置文件到src下
4.2 在Spring容器對應的配置文件中 配置創建對象的說明
<bean id="" class="包名.類名" > </bean>
例子1:寫一個測試類 創建Spring容器對象 並通過容器獲取對應的對象即可
例子: applicationContext.xml配置文件中加入的代碼
<!-- 配置創建日期對象 相當於 Date date = new java.util.Date() -->
<bean id="date" class="java.util.Date"></bean>
ApplicationContextTest.java中使用容器創建對象
public static void main(String[] args) {
//創建Spring 容器對象 並 關聯配置文件
ApplicationContext app =
new ClassPathXmlApplicationContext("applicationContext.xml");
//注意使用的是Spring下面的ApplicationContext的類,
//ClassPathXml 一般選擇第三個(String ConfigLocation類型的的)
// 從容器中獲取bean 對象
Date date = (Date) app.getBean("date"); //第一種方式
System.out.println(date);
Date date2 = app.getBean("date",Date.class);//推薦使用第二種方式
System.out.println(date2);
}
例子2:創建一個HashMap類型的對象,並通過Spring 容器獲取
//HashMapTest.java
public static void main(String[] args) {
ApplicationContext app =
new ClassPathXmlApplicationContext("applicationContext.xml");
HashMap map = app.getBean("map",HashMap.class);
System.out.println(map);
}
<!-- 配置創建HashMap對象 相當於 HashMap hashmap = new java.util.Map<String,String>() -->
<bean id="map" class="java.util.HashMap"></bean>
例子3:重新建立一個項目 在這個項目中定義一個 Emp 類 這個類中成員變量 有 int id String name double salary 提供get set 方法
提供無參帶參構造重寫toString方法 。然後在Spring 容器中配置這個對象 並通過容器獲取這個對象打印。默認調取無參構造!!!
//Emptest.java
public static void main(String[] args) {
ApplicationContext app =
new ClassPathXmlApplicationContext("applicationContext.xml");
Emp emp = app.getBean("emp",Emp.class);
System.out.println(emp);
}
<!-- 配置文件中需要配置 -->
<!-- 配置Emp 對象 構造器方式構造-->
<bean id="emp" class="com.xdl.bean.Emp"></bean>
5.Spring 容器 創建對象的三種方式 ***
第一種方式:
構造器方式實例化 :
<bean id="" class="" />
默認調用 類型對應的無參構造
第二種方式:
靜態工廠方法實例化 --- 比如創建日曆類型的對象 Calendar
<bean id="" class="包名.工廠類名" factory-method="靜態方法名">
例子:
<!--配置文件 -->
<!-- 靜態工廠實例化 -->
<bean id="cal" class="java.util.Calendar" factory-method="getInstance"></bean>
//日曆類型獲取 Calendar.java
public static void main(String[] args) {
ApplicationContext app =
new ClassPathXmlApplicationContext("applicationContext.xml");
//java代碼形式
// Calendar cal = Calendar.getInstance();
// System.out.println(cal);
Calendar cal = app.getBean("cal",Calendar.class);
System.out.println(cal);
}
第三種方式:
實例工廠方法實例化
使用一個已經存在的對象 創建另外一個對象。
<bean id="" class="包名.目標對象類型" factory-method="實例化方法名" factory-bean="工廠類型的對象">
cal就指已經工廠類型的對象。例子是通過Calendar對象拿出來Date類型的對象。
<!-- 靜態工廠實例化 -->
<bean id="cal" class="java.util.Calendar" factory-method="getInstance"></bean>
<!-- 實例工場方式實例化 -->
<bean id="date2" class="java.util.Date" factory-method="getTime" factory-bean="cal"></bean>
public static void main(String[] args) {
ApplicationContext app =
new ClassPathXmlApplicationContext("applicationContext.xml");
//java代碼形式
// Calendar cal = Calendar.getInstance();
// System.out.println(cal);
Calendar cal = app.getBean("cal",Calendar.class);
System.out.println(cal);
//通過Calendar類型的對象拿出來Date類型的對象!
Date date = app.getBean("date2",Date.class);
System.out.println(date);
}
6.Spring 容器中對象的作用域
在Spring 容器中 一個bean 是單例 還是 非單例 會堪稱不同的作用域
默認一個bean 的作用域是 單例的 可以通過在bean標記上 加 scope="prototype"
來改變對象的作用域。其它scope 取值 如 request session 等 在web部分會涉及。
7.對象的初始化 銷燬 和 延遲實例化
7.1對象的初始化
在beans 標記中 加default-init-method="初始化方法名" 由於這樣影響的類型非常多
所以 類型中沒有定義這個初始化方法也不會報錯。
另外可以在bean 標記中加 init-method="初始化方法名" 這樣隻影響指定的bean對象
所以 這個對象對應的類型中如果沒有定義這個初始化方法 則會報錯。
<!-- 對象的初始化 -->
<bean id="emp3" class="com.xdl.bean.Emp" scope="prototype" init-method="initEmp"></bean>
//Emp.java中需要添加initEmp初始化方法
public void initEmp() {
this.name="xxx";
System.out.println("init emp");
}
7.2 對象的銷燬
在beans 標記中 加default-destroy-method="銷燬方法名" 由於這樣影響的類型非常多
所以類型中沒有定義這個銷燬方法也不會報錯。另外可以在bean標記中加 destroy-method
="銷燬方法名" 這樣隻影響指定的bean對象 所以這個對象對應的類型中如果沒有定義
這個銷燬方法 則會報錯。 (只適合單例對象)
<!-- 單例類型對象的銷燬 -->
<bean id="emp4" class="com.xdl.bean.Emp" scope="singleton" destroy-method="destroyEmp"></bean>
//Emp.java中加入銷燬函數
public void destroyEmp() {
System.out.println("交代後話吧!!");
}
//測試類中若想打印出來銷燬函數的輸出內容需要使用下面的接口僅限單例對象
public static void main(String[] args) {
AbstractApplicationContext app =
new ClassPathXmlApplicationContext("applicationContext.xml");
Emp emp4 = app.getBean("emp4",Emp.class);
System.out.println(emp4);
app.close();
}
7.3延遲實例化 (只適合單例對象)
對Spring 容器中單例對象 在容器啓動時 就會創建這些對象。而非單例對象 是請求這個
對象時纔會創建。 哪能不能讓單例對象 也在請求的時候創建 而不是容器啓動時創建呢?
可以在beans標記中加 default-lazy-init="false" 如果希望延遲實例化設置成true即可
但是這種做法影響的範圍太大 所以可以在bean標記中加 lazy-init="true"。
例子:定義一個撲克牌類 Card 裏面定義兩個成員變量 String suit String point
提供get set方法 無參 全參 toString 。在Spring 容器配置文件中配置這個類型的
對象 並通過Spring 容器獲取。再定義一個玩家類 Player 成員變量有 int id
String name int age double money Card card
提供get set方法 無參 全參 toString 。在Spring 容器配置文件中配置這個類型的
對象 並通過Spring 容器獲取。