學過Spring的小伙伴對于IOC一定不陌生,IOC:控制反轉(Inversion of Control,英文縮寫為IoC)是一個重要的面向對象編程的法則來削減計算機程序的耦合問題,也是輕量級的Spring框架的核心。 控制反轉一般分為兩種類型,依賴注入(Dependency Injection,簡稱DI)和依賴查找(Dependency Lookup)。依賴注入應用比較廣泛。本篇我們通過一個實例和大家簡單分析一下Spring中IOC的原理,以便我們可以更好的理解Spring。
簡單描述一下我們的場景,添加新用戶到數據庫,這里我們采用分層的方式,進行功能的實現,我們知道,開發程序一定要注意程序的可移植性,所以這里簡單為大家介紹一下面向接口編程,面向接口編程就是面向抽象編程、面向規范編程,它帶來的最大的好處便是解耦、增強擴展性、屏蔽變化。
好了下面我們開始我的業務實現,首先我們需要創建一個Model--UserDO.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class UserDO { private String name; private String password; public String getName() { return name; } public void setName(String name) { this .name = name; } public String getPassword() { return password; } public void setPassword(String password) { this .password = password; } } |
有了我們的用戶對象,下面我們開始創建Selvect類,Selvect我們知道,使用了接收用戶請求的對象,這里因為我們只是為了方便大家理解,所以我們在Selvect中模擬收到用戶請求后進行相關業務邏輯處理:
1
2
3
4
5
6
7
8
|
public class UserSelvect { public static void main(String[] args) { UserDO userDO = new UserDO(); BeanFactory beanFactory = new ClassPathXmlApplicationContext(); //創建我們的Bean工廠 UserService userService = (UserService) beanFactory.getBean( "userService" ); //通過類名來獲得類對象 userService.add(userDO); //完成業務邏輯 } } |
一般我們的業務邏輯會放在Service層進行操作,所以我能先來看一下我們的Service對象:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public class UserService { private UserDao userDao; //實例DAO對象 public UserDao getUserDao() { return userDao; } //用于Bean工廠中進行DAO動態綁定 public void setUserDao(UserDao userDao) { this .userDao = userDao; } //用于Selvect對象調用,進行業務邏輯處理 public void add(User u){ userDao.add(u); } } |
下面就是我們的DAO層的實現了,這里就要說明了,為了最大化提高程序的可移植性,接下來將采用接口編程的實現進行設計:
1
2
3
4
5
6
7
|
/** * DAO類只有方法定義 * 從而減低程序直接的耦合 */ public interface UserDao { public void add(User u); } |
既然是面向接口編程,就一定需要實現接口的類:
1
2
3
4
5
|
public class UserDaoImpl implements UserDao{ public void add(User u){ System.out.println( "保存一個學生對象" ); } } |
好了到這里我們的基本框架已經完成,接下來就要開始重點的內容了,首先我們需要先了解一些關于xml解析的知識,在之前的博客中已經為大家介紹了過一種方式:Jdom讀取XML文件,不了解的小伙伴可以先移步簡單查看一下,這樣接下來的內容,你才不至于感到吃力。下面我們進行我們的這個Demo的設計,首先在src目錄下添加一個Spring.xml文件:
1
2
3
4
5
6
7
|
<? xml version = "1.0" encoding = "UTF-8" ?> < beans > < bean id = "userDao" class = "com.manyiaby.daoimpl.UserDaoImpl" ></ bean > < bean id = "userService" class = "com.manyiaby.service.UserService" > < property name = "userDao" bean = "userDao" ></ property > </ bean > </ beans > |
下面我們定義一個Bean工程對象,用來讀取我們的Spring.xml文件,從而完成對象實例的創建,一便接下來的業務操作:
1
2
3
|
public interface BeanFactory { public Object getBean(String className); } |
大家是不是發現我們的Bean工場也是采用接口編程的思想,接下來看一下我們的工場實現類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
public class ClassPathXmlApplicationContext implements BeanFactory{ private Map<String, Object> beanMap = new HashMap<String, Object>(); //用來存配置文件中的類對象 public ClassPathXmlApplicationContext(){ try { SAXBuilder saxBulder = new SAXBuilder(); Document doc = saxBulder.build(ClassPathXmlApplicationContext. class .getClassLoader().getResourceAsStream( "spring.xml" )); Element root = doc.getRootElement(); //獲取根元素 List<Element> list = root.getChildren( "bean" ); for (Element element : list) { String id = element.getAttributeValue( "id" ); //得到beanId String className = element.getAttributeValue( "class" ); //得到Bean的類名地址 System.out.println(className); Object object = Class.forName(className).newInstance(); beanMap.put(id, object); if ( null != element.getChild( "property" )) { Element property = element.getChild( "property" ); String name = property.getAttributeValue( "name" ); String beanId = property.getAttributeValue( "bean" ); Object beanObject = beanMap.get(beanId); //UserDaoImpl String methodName = "set" + name.substring( 0 , 1 ).toUpperCase() + name.substring( 1 ); //setUserDao System.out.println(methodName); Method m = object.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[ 0 ]); //UserService的SetUserDao()方法,接收的參數為UserDao接口類 m.invoke(object, beanObject); //調用UserService的SetUserDao()方法,傳入UserDaoImpl } } } catch (Exception e) { System.out.println( "" + e); } } //用于類調用 @Override public Object getBean(String className) { return beanMap.get(className); } } |
簡單為大家介紹一下,我們通過beanMap將我們在Spring中配置的對象,通過反射機制拿到,然后放置于beanMap對象中,通過getBean方法,共外部類調用。
上面簡單模擬了一下Spring中IOC的一些內容,下面咱們一起來看一下,如何通過Spring完成上面的操作,首先我們需要下載spring.jar,有了這個jar還不夠,spring還依賴commons-logging.jar,好了將這兩個jar包導入到我們的工程中,然后我們就來看一下如何實現使用:
1
2
3
4
5
6
7
8
9
10
|
public class UserSelvect { public void main() { UserDO userDO = new UserDO(); BeanFactory beanFactory = new ClassPathXmlApplicationContext( "spring.xml" ); UserService userService = (UserService) beanFactory.getBean( "userService" ); //ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); //UserService userService = (UserService) context.getBean("userService"); userService.add(userDO); } } |
其他不用修改,是不是很簡單,好了,關于Spring的內容為大家介紹到這里。
希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持服務器之家!
原文鏈接:http://www.cnblogs.com/AndroidJotting/p/6581452.html