Spring框架:
借鑒:http://www.cnblogs.com/cyjch/archive/2012/02/06/2340415.html
Spring框架依賴於兩個jar包:spring.jar、commons-logging.jar。
為便於測試,加入了Junit.jar。
一、一個簡單的示例:
接口類:
1 package com.imooc.myinterface; 2 3 public interface PersonInterface { 4 void show(); 5 }
實現類:
1 package com.imooc.mybean; 2 3 import com.imooc.myinterface.PersonInterface; 4 5 /** 6 * UserBean實現了PersonInterface接口 7 */ 8 public class UserBean implements PersonInterface { 9 @Override 10 public void show() { 11 System.out.println("UserBean 實現了 PersonInterface接口的 show方法"); 12 } 13 }
在spring.xml中配置實現類的bean:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:mvc="http://www.springframework.org/schema/mvc" 5 xmlns:context="http://www.springframework.org/schema/context" 6 xmlns:aop="http://www.springframework.org/schema/aop" 7 xmlns:tx="http://www.springframework.org/schema/tx" 8 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 9 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 10 http://www.springframework.org/schema/aop 11 http://www.springframework.org/schema/aop/spring-aop.xsd 12 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 13 14 15 <bean id="userBean" class="com.imooc.mybean.UserBean"></bean> 16 17 </beans>
測試代碼:
1 package com.imooc.test; 2 3 import com.imooc.myinterface.PersonInterface; 4 import org.junit.Test; 5 import org.springframework.context.ApplicationContext; 6 import org.springframework.context.support.ClassPathXmlApplicationContext; 7 8 public class TestBean { 9 @Test 10 public void testUserBean(){ 11 ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 12 PersonInterface person = (PersonInterface) context.getBean("userBean"); 13 person.show(); 14 } 15 }
測試代碼的輸出結果:
1 UserBean 實現了 PersonInterface接口的 show方法
二、實例化Bean的三種方式:
類構造器、靜態工廠、實例工廠實例化bean。
BeanFactory類:
1 package com.imooc.factory; 2 3 import com.imooc.mybean.UserBean; 4 import com.imooc.myinterface.PersonInterface; 5 6 public class BeanFactory { 7 8 //使用靜態工廠實例化使用 9 public static PersonInterface UserBeanService(){ 10 return new UserBean(); 11 } 12 13 public PersonInterface getUserBeanService(){ 14 return new UserBean(); 15 } 16 }
spring.xml:
1 <!--使用類構造器直接實例化--> 2 <bean id="userBean" class="com.imooc.mybean.UserBean"></bean> 3 <!--使用靜態工廠實例化--> 4 <bean id="userBean2" class="com.imooc.factory.BeanFactory" factory-method="UserBeanService"></bean> 5 <!--使用實例工廠實例化--> 6 <bean id="factory" class="com.imooc.factory.BeanFactory"></bean> 7 <bean id="userBean3" factory-bean="factory" factory-method="getUserBeanService"></bean>
三、Bean的節點信息:
默認情況下,Spring的IOC容器啟動時會初始化bean,但可以設置bean的lazy-init="true",來延遲bean的啟動,這時只有第一次獲取bean的時候才會初始化bean。
若想對所有bean設置初始延時,則可以再根節點beans設置default-lazy-init="true"。
初始化方法可以在bean中加入init_method="init"屬性,其中init為該bean的一個方法;對應有destory-method屬性。
在Spring中通過getBean方法獲得實例,可以用“==”來測試是一個還是多個實例。
1 ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 2 PersonInterface person = (PersonInterface) context.getBean("userBean3"); 3 PersonInterface person2 = (PersonInterface) context.getBean("userBean3"); 4 person.show(); 5 System.out.println(person == person2);
結果:
1 UserBean 實現了 PersonInterface接口的 show方法 2 true
調用了2次getBean但只輸出了一次:UserBean 實現了 PersonInterface接口的 show方法,且,返回true說明是一個實例。
Bean交給容器後,默認是單實例的,那麼如何獲取一個新的實例對象?
scope屬性:
令scope=“prototype”即可。
四、Spring的核心機制---依賴注入(Dependence Injection)
依賴注入讓bean與bean直接通過配置文件組織在一起;
依賴注入與控制反轉(Inversion of Control)是同一個概念;
借鑒:http://www.cnblogs.com/xdp-gacl/p/4249939.html
A對象需要使用B對象時,A對B產生了依賴,傳統上我們會new出B(主動權在自己);
但在Spring中創建B的工作由Spring容器完成,然後注入到A中(控制權在Spring容器)
控制反轉:創建對象的控制權進行了轉移(自己-->spring容器)
什麼被反轉了?獲得依賴對象的方式被反轉了!!!
UserDao接口:
1 package com.imooc.myinterface; 2 3 public interface UserDao { 4 void show(); 5 }
UserDao的實現類:UserDao4MysqlImpl和UserDao4OracleImpl
1 package com.imooc.impl; 2 3 import com.imooc.myinterface.UserDao; 4 public class UserDao4MysqlImpl implements UserDao { 5 @Override 6 public void show() { 7 System.out.println("UserDao4MysqlImpl"); 8 } 9 } 10 11 12 package com.imooc.impl; 13 14 import com.imooc.myinterface.UserDao; 15 16 public class UserDao4OracleImpl implements UserDao{ 17 @Override 18 public void show() { 19 System.out.println("UserDao4OracleImpl"); 20 } 21 }
UserService接口:
1 package com.imooc.impl; 2 3 import com.imooc.myinterface.UserDao; 4 import com.imooc.myinterface.UserService; 5 6 /** 7 * 實現UserService接口是調用了userDao的show方法,一般需要實例化一個UserDao對象: 8 * UserDao userDao = new UserDao4MysqlImpl(); 9 * 這樣耦合度會上升; 10 * 所以可以配置spring.xml進行注入。 11 */ 12 public class UserServiceImpl implements UserService { 13 private UserDao userDao; //私有的,用於注入 14 15 @Override 16 public void show() { 17 userDao.show(); 18 } 19 20 public UserDao getUserDao() { 21 return userDao; 22 } 23 24 public void setUserDao(UserDao userDao) { 25 this.userDao = userDao; 26 } 27 }
spring.xml:
1 <bean id="mysqlDao" class="com.imooc.impl.UserDao4MysqlImpl"></bean> 2 <bean id="oracleDao" class="com.imooc.impl.UserDao4OracleImpl"></bean> 3 <bean id="userService" class="com.imooc.impl.UserServiceImpl"> 4 <property name="userDao" ref="mysqlDao"></property> 5 </bean>
測試代碼:
1 @Test 2 public void testUserService(){ 3 ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 4 UserService userService = (UserService) context.getBean("userService"); 5 userService.show(); 6 }
結果:
1 UserDao4MysqlImpl
這樣就實現了注入!