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
這樣就實現了注入!