本教程對應視頻課程:http://edu.51cto.com/course/14731.htmlhtml
BeanFactory:這個接口是spring中最底層的接口,只提供了最簡單的IoC功能(建立bean,獲取bean,銷燬bean)java
在通常的應用當中,通常不使用BeanFactory;推薦用ApplicationContext(應用上下文);web
1.ApplicationContext繼承了BeanFactory,提供了基本的IoC功能;spring
2.ApplicationContext還提供了其餘功能,好比支持國際化,消息機制,統一的資源加載,AOP功能等apache
一、ClassPathXmlApplicationContext:讀取classpath中的資源oracle
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
二、FileSystemXmlApplicationContextapp
ApplicationContext ac = new FileSystemXmlApplicationContext("c:/licationContext.xml");
三、XmlWebApplicationContextdom
XmlWebApplicationContext ac = new XmlWebApplicationContext(); // 須要指定ServletContext對象 ac.setServletContext(servletContext); // 指定配置文件路徑,開頭的斜線表示Web應用的根目錄 ac.setConfigLocation("/WEB-INF/applicationContext.xml"); // 初始化容器 ac.refresh();
ClassPathResource:從classpath根路徑開始找配置文件 ide
FileSystemResource:從磁盤的文件路徑去找c://xx.xml測試
ServletContextResource:應用於web中,從web中去找配置文件
1.ApplicationContext在加載的時候就會建立全部的bean(Web應用建議)
2.BeanFactory須要等到拿bean的時候纔會建立bean(延遲加載)(桌面程序)
延遲加載
ApplicationContext作到延遲加載的效果:
針對於當前xml中全部的bean。<beans default-lazy-init="default | false | true">針對於指定的bean:
<beans lazy-init="default | false | true">
<bean id="" class="" scope="做用域"/>
singleton: 單例 :在Spring IoC容器中僅存在一個Bean實例 (默認的scope)
prototype: 多例 :每次從容器中調用Bean時,都返回一個新的實例,即每次調用getBean()時 ,至關於執行new 不會在容器啓動時建立對象
對於MVC中的Action(Struts2)使用prototype類型,其餘使用singleton
<bean id="someBean" class="......" init-method="該類中初始化方法名" destroy-method="該類中銷燬方法名"> </bean>
init-method:bean生命週期初始化方法,對象建立後就進行調用
destroy-method:容器被銷燬的時候,若是bean被容器管理,會調用該方法。
若是bean的scope="prototype",那麼容器只負責建立和初始化,它並不會被spring容器管理。
構造器實例化,最標準,使用最多
java類
public class SomeBean1 {}
xml配置
<bean id="someBean1" class="SomeBean1全限定名"/>
java類
public class SomeBean2Factory { public static SomeBean2 getSomeBean2(){ return new SomeBean2(); } } public class SomeBean2 {}
xml配置
<bean id="someBean2" class="SomeBean2Factory全限定名" factory-method="getSomeBean2"/>
此時咱們經過上下文對象獲取id爲someBean2的對象,這個對象的類型爲SomeBean2
實例工廠方法實例化:解決系統遺留問題,有點麻煩,使用比較少
public class SomeBean3 {} public class SomeBean3Factory { public SomeBean3 getSomeBean3() { return new SomeBean3(); } }
xml配置
<bean id="someBean3Factory" class="SomeBean3Factory全限定名"/> <bean id="someBean3" factory-bean="someBean3Factory" factory-method="getSomeBean3"/>
此時咱們獲取id爲someBean3的對象,實際上會建立實例工廠,而後在經過實例工廠的工廠方法來或者SomeBean3的對象
java類
public class SomeBean4 {} public class SomeBean4FactoryBean implements FactoryBean<SomeBean4>{ //返回對象 public SomeBean4 getObject() throws Exception { return new SomeBean4(); } //返回對象的類型 public Class<?> getObjectType() { return SomeBean4.class; } //返回是否單例 public boolean isSingleton() { return true; } }
xml配置
<bean id="someBean4" class="SomeBean4FactoryBean全限定名" />
IoC(inverse of control):指將對象的建立權,反轉到Spring容器;
DI (Dependency Injection) :指Spring建立對象的過程當中,將對象依賴屬性經過配置進行注入 。
其實它們是同一個概念的不一樣角度描述。DI相對IoC而言,明確描述了」被注入對象依賴IoC容器配置依賴對象」。
使用setter注入:
1.使用bean元素的property子元素設置;
簡單類型值,直接使用value賦值;
引用類型,使用ref賦值;
集合類型,直接使用對應的集合類型元素便可。
2.spring經過屬性的setter方法注入值;
3.在配置文件中配置的值都是string,spring能夠自動的完成類型的轉換
4.屬性的設置值是在init方法執行以前完成的
構造器注入
1.spring在實例化對象的時候,若是對象沒有配置constructor-arg,則使用默認的構造器實例化對象
2.若是有constructor-arg,那麼spring使用這些constructor-arg來惟一肯定一個構造器
一、簡單類型數據
java類編寫
public class Employee { private String name; private Integer age; private Double salary; private URL url; 省略setter/getter }
xml配置
<bean id="employee" class="cn.org.kingdom.vo.Employee"> <property name="name" value="kingdom" /> <property name="age" value="17" /> <property name="salary" value="123" /> <property name="url" value="http://urlValue" /> </bean>
2.對象類型的值
java類
public class EmpDAO { public void save(){ System.out.println("EmpDAO.save()"); } } public class EmpService { private EmpDAO dao;//持有一個引用數據類型 public void setDao(EmpDAO dao) { this.dao = dao; } public void save() { dao.save(); System.out.println("EmpService.save()"); } }
xml文件配置
<bean id="empDAO" class="cn.org.kingdom.vo.EmpDAO" /> <bean id="empService" class="cn.org.kingdom.vo.EmpService"> <property name="dao" ref="empDAO" /> </bean>
3.注入集合類型
java類
public class ConnectionBean { private Set<String> set; private List<String> list; private String[] array; private Map<String, String> map; private Properties prop; 省略setter/getter }
xml文件配置
<bean id="collectionBean" class="cn.org.kingdom.dbc.ConnectionBean"> <property name="set"> <set> <value>set1</value> <value>set2</value> <value>set3</value> </set> </property> <property name="list"> <list> <value>list1</value> <value>list2</value> <value>list3</value> </list> </property> <property name="array"> <list> <value>array1</value> <value>array2</value> <value>array3</value> </list> </property> <property name="map"> <map> <entry key="key1" value="value1"/> <entry key="key2" value="value2"/> <entry key="key3" value="value3"/> </map> </property> <property name="prop"> <props> <prop key="pKey1">pVal1</prop> <prop key="pKey2">pVal2</prop> <prop key="pKey3">pVal3</prop> </props> </property> </bean>
一、添加jar包
使用DataSource的案例,給數據源注入Property中的數據加入相關jar包支持
commons-dbcp-1.2.2.jar、commons-pool-1.5.3.jar、com.springsource.oracle.jdbc-10.2.0.2.jar
二、引入context命名空間
<?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 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>
三、拷貝db.properties文件
db.driver=oracle.jdbc.driver.OracleDriver db.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl db.username=scott db.password=tiger
四、加載配置文件
<context:property-placeholder location="classpath:db.properties"/> <bean id = "ds" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${db.driver}"></property> <property name="url" value="${db.url}"></property> <property name="username" value="${db.username}"></property> <property name="password" value="${db.password}"></property> </bean>
五、測試
package cn.org.kingdom.test; import org.apache.commons.dbcp.BasicDataSource; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4Cla***unner; @RunWith(SpringJUnit4Cla***unner.class) @ContextConfiguration public class SpringTest { @Autowired private BeanFactory factory; @Autowired private AbstractApplicationContext ctx ; @Test public void testSpringTest() throws Exception { BasicDataSource ds = (BasicDataSource) ctx.getBean("ds"); System.out.println(ds.getConnection()); } }