Spring 基礎入門-day01

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 容器獲取。


 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章