上篇Spring博文主要引出了爲啥咱們須要使用Spring框架,以及大體瞭解了Spring是分爲六大模塊的….本博文主要講解Spring的core模塊!html
本博文主要是core模塊的內容,涉及到Spring core的開發jar包有五個:java
我主要使用的是Spring3.2版本…spring
Spring核心的配置文件applicationContext.xml
或者叫bean.xml
express
那這個配置文件怎麼寫呢??通常地,咱們都知道框架的配置文件都是有約束的…咱們能夠在spring-framework-3.2.5.RELEASE\docs\spring-framework-reference\htmlsingle\index.html
找到XML配置文件的約束markdown
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> </beans>
我是使用Intellij Idea集成開發工具的,能夠選擇自帶的Spring配置文件,它長的是這樣:app
<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans>
前面在介紹Spring模塊的時候已經說了,Core模塊是:IOC容器,解決對象依賴關係。框架
所以Core模塊主要是學習如何獲得IOC容器,經過IOC容器來建立對象、解決對象之間的依賴關係、IOC細節。函數
Spring容器不僅僅只有一個,能夠歸爲兩種類型工具
//加載Spring的資源文件 Resource resource = new ClassPathResource("applicationContext.xml"); //建立IOC容器對象【IOC容器=工廠類+applicationContext.xml】 BeanFactory beanFactory = new XmlBeanFactory(resource);
// 獲得IOC容器對象 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); System.out.println(ac);
在上面咱們已經能夠獲得IOC容器對象了。接下來就是在applicationContext.xml文件中配置信息【讓IOC容器根據applicationContext.xml文件來建立對象】學習
/** * Created by ozc on 2017/5/10. */ public class User { private String id; private String username; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } }
User user = new User();
<!-- 使用bean節點來建立對象 id屬性標識着對象 name屬性表明着要建立對象的類全名 --> <bean id="user" class="User"/>
// 獲得IOC容器對象 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); User user = (User) ac.getBean("user"); System.out.println(user);
在Spring第一篇中,咱們爲何要引入Spring提出了這麼一些問題:
既然咱們如今已經初步瞭解IOC容器了,那麼這些問題咱們都是能夠解決的。而且是十分簡單【對象寫死問題已經解決了,IOC容器就是控制反轉建立對象】
指定scope屬性,IOC容器就知道建立對象的時候是單例仍是多例的了。
屬性的值就只有兩個:單例/多例
scope屬性除了控制對象是單例仍是多例的,還控制着對象建立的時間!
public User() { System.out.println("我是User,我被建立了"); }
lazy-init屬性只對singleton【單例】的對象有效…..lazy-init默認爲false….
有的時候,可能咱們想要對象在使用的時候才建立,那麼將lazy-init設置爲ture就好了
若是咱們想要對象在建立後,執行某個方法,咱們指定爲init-method屬性就好了。。
若是咱們想要IOC容器銷燬後,執行某個方法,咱們指定destroy-method屬性就好了。
<bean id="user" class="User" scope="singleton" lazy-init="true" init-method="" destroy-method=""/>
/** * 1) 對象建立: 單例/多例 * scope="singleton", 默認值, 即 默認是單例 【service/dao/工具類】 * scope="prototype", 多例; 【Action對象】 * * 2) 何時建立? * scope="prototype" 在用到對象的時候,才建立對象。 * scope="singleton" 在啓動(容器初始化以前), 就已經建立了bean,且整個應用只有一個。 * 3)是否延遲建立 * lazy-init="false" 默認爲false, 不延遲建立,即在啓動時候就建立對象 * lazy-init="true" 延遲初始化, 在用到對象的時候才建立對象 * (只對單例有效) * 4) 建立對象以後,初始化/銷燬 * init-method="init_user" 【對應對象的init_user方法,在對象建立以後執行 】 * destroy-method="destroy_user" 【在調用容器對象的destroy方法時候執行,(容器用實現類)】 */
上面咱們使用的是IOC經過無參構造函數來建立對象,咱們來回顧一下通常有幾種建立對象的方式:
使用無參的構造函數建立對象咱們已經會了,接下來咱們看看使用剩下的IOC容器是怎麼建立對象的。
首先,JavaBean就要提供帶參數的構造函數:
public User(String id, String username) { this.id = id; this.username = username; }
接下來,關鍵是怎麼配置applicationContext.xml文件了。
<bean id="user" class="User"> <!--經過constructor這個節點來指定構造函數的參數類型、名稱、第幾個--> <constructor-arg index="0" name="id" type="java.lang.String" value="1"></constructor-arg> <constructor-arg index="1" name="username" type="java.lang.String" value="zhongfucheng"></constructor-arg> </bean>
在constructor上若是構造函數的值是一個對象,而不是一個普通類型的值,咱們就須要用到ref屬性了,而不是value屬性
好比說:我在User對象上維護了Person對象的值,想要在構造函數中初始化它。所以,就須要用到ref屬性了
<bean id="person" class="Person"></bean> <bean id="user" class="User" > <!--經過constructor這個節點來指定構造函數的參數類型、名稱、第幾個--> <constructor-arg index="0" name="id" type="java.lang.String" value="1"></constructor-arg> <constructor-arg index="1" name="username" type="java.lang.String" ref="person"></constructor-arg> </bean>
首先,使用一個工廠的靜態方法返回一個對象
public class Factory { public static User getBean() { return new User(); } }
配置文件中使用工廠的靜態方法返回對象
<!--工廠靜態方法建立對象,直接使用class指向靜態類,指定靜態方法就好了--> <bean id="user" class="Factory" factory-method="getBean" > </bean>
首先,也是經過工廠的非非靜態方法來獲得一個對象
public class Factory { public User getBean() { return new User(); } }
配置文件中使用工廠的非靜態方法返回對象
<!--首先建立工廠對象--> <bean id="factory" class="Factory"/> <!--指定工廠對象和工廠方法--> <bean id="user" class="User" factory-bean="factory" factory-method="getBean"/>