一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring之IOC詳解

Spring之IOC詳解

2020-08-30 11:10小破孩123 Java教程

本文主要介紹了Spring中的IOC的相關知識。具有很好的參考價值。下面跟著小編一起來看下吧

學過Spring的小伙伴對于IOC一定不陌生,IOC:控制反轉(Inversion of Control,英文縮寫為IoC)是一個重要的面向對象編程的法則來削減計算機程序的耦合問題,也是輕量級的Spring框架的核心。 控制反轉一般分為兩種類型,依賴注入(Dependency Injection,簡稱DI)和依賴查找(Dependency Lookup)。依賴注入應用比較廣泛。本篇我們通過一個實例和大家簡單分析一下Spring中IOC的原理,以便我們可以更好的理解Spring。

簡單描述一下我們的場景,添加新用戶到數據庫,這里我們采用分層的方式,進行功能的實現,我們知道,開發程序一定要注意程序的可移植性,所以這里簡單為大家介紹一下面向接口編程,面向接口編程就是面向抽象編程、面向規范編程,它帶來的最大的好處便是解耦、增強擴展性、屏蔽變化。

Spring之IOC詳解

好了下面我們開始我的業務實現,首先我們需要創建一個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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费特黄一区二区三区视频一 | 大胆国模一区二区三区伊人 | 四虎影视在线影院在线观看 | 12345国产精品高清在线 | 日韩高清一区二区三区不卡 | 成人男女啪啪免费观看网站 | 国产福利片在线 易阳 | 亚洲国产区男人本色在线观看欧美 | 被老外玩爽的中国美女视频 | 99热这里只有精品在线 | 91精品国产亚一区二区三区 | 女同色图 | 国产美女久久久久 | 欧美bbb人妖| 欧美国产日韩综合 | 亚洲精品一区二区三区中文字幕 | 小小水蜜桃3视频在线观看 小鸟酱喷水 | 扒开双腿疯狂进出爽爽动态图 | 亚洲高清在线天堂精品 | 99re思思| 四虎影在线永久免费观看 | 欧美日韩国产中文字幕 | 女同色图 | 日韩无砖2021特黄 | 国内精品久久久久影院网站 | 亚洲欧美日韩国产一区二区精品 | 亚洲h片 | 天天操丝袜| 91免费在线 | 天堂中文在线观看 | 亚洲成色www久久网站 | 掀开奶罩边躁狠狠躁软学生 | 波多野结衣中文字幕在线 | 成人精品在线 | 国产网站免费观看 | 欧美一区二区不卡视频 | 好男人社区www影院在线观看 | 色老板影视 | 国内外精品免费视频 | 91影视永久福利免费观看 | 日韩无砖专区体验区 |