上篇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"/>