最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring之IOC詳解

 更新時(shí)間:2017年03月20日 09:00:52   作者:小破孩123  
本文主要介紹了Spring中的IOC的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來看下吧

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

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

好了下面我們開始我的業(yè)務(wù)實(shí)現(xiàn),首先我們需要?jiǎng)?chuàng)建一個(gè)Model--UserDO.java

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;
 }
}

有了我們的用戶對象,下面我們開始創(chuàng)建Selvect類,Selvect我們知道,使用了接收用戶請求的對象,這里因?yàn)槲覀冎皇菫榱朔奖愦蠹依斫?,所以我們在Selvect中模擬收到用戶請求后進(jìn)行相關(guān)業(yè)務(wù)邏輯處理:

public class UserSelvect {
 public static void main(String[] args) {
  UserDO userDO = new UserDO();
  BeanFactory beanFactory = new ClassPathXmlApplicationContext();//創(chuàng)建我們的Bean工廠
  UserService userService = (UserService) beanFactory.getBean("userService");//通過類名來獲得類對象
  userService.add(userDO);//完成業(yè)務(wù)邏輯
 }
}

一般我們的業(yè)務(wù)邏輯會(huì)放在Service層進(jìn)行操作,所以我能先來看一下我們的Service對象:

public class UserService {
 private UserDao userDao;//實(shí)例DAO對象
 public UserDao getUserDao() {
  return userDao;
 }
 //用于Bean工廠中進(jìn)行DAO動(dòng)態(tài)綁定
 public void setUserDao(UserDao userDao) {
  this.userDao = userDao;
 }
 //用于Selvect對象調(diào)用,進(jìn)行業(yè)務(wù)邏輯處理
 public void add(User u){
  userDao.add(u);
 }
}

下面就是我們的DAO層的實(shí)現(xiàn)了,這里就要說明了,為了最大化提高程序的可移植性,接下來將采用接口編程的實(shí)現(xiàn)進(jìn)行設(shè)計(jì):

/**
 * DAO類只有方法定義
 * 從而減低程序直接的耦合
 */
public interface UserDao {
 public void add(User u);
}

既然是面向接口編程,就一定需要實(shí)現(xiàn)接口的類:

public class UserDaoImpl implements UserDao{
 public void add(User u){
  System.out.println("保存一個(gè)學(xué)生對象");
 }
}

好了到這里我們的基本框架已經(jīng)完成,接下來就要開始重點(diǎn)的內(nèi)容了,首先我們需要先了解一些關(guān)于xml解析的知識(shí),在之前的博客中已經(jīng)為大家介紹了過一種方式:Jdom讀取XML文件,不了解的小伙伴可以先移步簡單查看一下,這樣接下來的內(nèi)容,你才不至于感到吃力。下面我們進(jìn)行我們的這個(gè)Demo的設(shè)計(jì),首先在src目錄下添加一個(gè)Spring.xml文件:

<?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>

下面我們定義一個(gè)Bean工程對象,用來讀取我們的Spring.xml文件,從而完成對象實(shí)例的創(chuàng)建,一便接下來的業(yè)務(wù)操作:

public interface BeanFactory {
 public Object getBean(String className);
}

大家是不是發(fā)現(xiàn)我們的Bean工場也是采用接口編程的思想,接下來看一下我們的工場實(shí)現(xiàn)類:

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()方法,接收的參數(shù)為UserDao接口類
     m.invoke(object, beanObject);//調(diào)用UserService的SetUserDao()方法,傳入U(xiǎn)serDaoImpl
    }
   }
  } catch (Exception e) {
   System.out.println("" + e);
  }
 }
 //用于類調(diào)用
 @Override
 public Object getBean(String className) {
  return beanMap.get(className);
 }
}

簡單為大家介紹一下,我們通過beanMap將我們在Spring中配置的對象,通過反射機(jī)制拿到,然后放置于beanMap對象中,通過getBean方法,共外部類調(diào)用。

上面簡單模擬了一下Spring中IOC的一些內(nèi)容,下面咱們一起來看一下,如何通過Spring完成上面的操作,首先我們需要下載spring.jar,有了這個(gè)jar還不夠,spring還依賴commons-logging.jar,好了將這兩個(gè)jar包導(dǎo)入到我們的工程中,然后我們就來看一下如何實(shí)現(xiàn)使用:

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);
 }
}

其他不用修改,是不是很簡單,好了,關(guān)于Spring的內(nèi)容為大家介紹到這里。

希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • javaweb上傳下載實(shí)例完整版解析(上)

    javaweb上傳下載實(shí)例完整版解析(上)

    這篇文章主要為大家詳細(xì)解析了javaweb上傳下載實(shí)例,本文重點(diǎn)在于文件上傳功能的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Java數(shù)據(jù)類型超詳細(xì)示例講解

    Java數(shù)據(jù)類型超詳細(xì)示例講解

    Java程序中要求參與的計(jì)算的數(shù)據(jù),必須要保證數(shù)據(jù)類型的一致性,如果數(shù)據(jù)類型不一致將發(fā)生類型的轉(zhuǎn)換。本文將通過示例詳細(xì)說說Java中數(shù)據(jù)類型的轉(zhuǎn)換,感興趣的可以了解一下
    2022-11-11
  • Spring Cloud實(shí)戰(zhàn)技巧之使用隨機(jī)端口

    Spring Cloud實(shí)戰(zhàn)技巧之使用隨機(jī)端口

    這篇文章主要給大家介紹了關(guān)于Spring Cloud實(shí)戰(zhàn)技巧之使用隨機(jī)端口的相關(guān)資料,文中介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-06-06
  • 詳解Spring MVC的攔截器與異常處理機(jī)制

    詳解Spring MVC的攔截器與異常處理機(jī)制

    這篇文章主要為大家詳細(xì)介紹了Spring MVC的攔截器與異常處理機(jī)制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Java每隔兩個(gè)數(shù)刪掉一個(gè)數(shù)問題詳解

    Java每隔兩個(gè)數(shù)刪掉一個(gè)數(shù)問題詳解

    這篇文章主要介紹了Java每隔兩個(gè)數(shù)刪掉一個(gè)數(shù)問題詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java中ByteArrayOutputStream亂碼問題解決

    Java中ByteArrayOutputStream亂碼問題解決

    本文主要介紹了Java中ByteArrayOutputStream亂碼問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • centos7安裝java的多種方式總結(jié)

    centos7安裝java的多種方式總結(jié)

    這篇文章主要給大家介紹了關(guān)于centos7安裝java的多種方式,文中通過實(shí)例代碼以及圖文介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-01-01
  • Java中Controller引起的Ambiguous?mapping問題及解決

    Java中Controller引起的Ambiguous?mapping問題及解決

    這篇文章主要介紹了Java中Controller引起的Ambiguous?mapping問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • springboot+Oauth2實(shí)現(xiàn)自定義AuthenticationManager和認(rèn)證path

    springboot+Oauth2實(shí)現(xiàn)自定義AuthenticationManager和認(rèn)證path

    本篇文章主要介紹了springboot+Oauth2實(shí)現(xiàn)自定義AuthenticationManager和認(rèn)證path,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • 解決IntelliJ IDEA 控制臺(tái)輸出中文亂碼問題(史上最簡單)

    解決IntelliJ IDEA 控制臺(tái)輸出中文亂碼問題(史上最簡單)

    這篇文章主要介紹了史上最簡單的IntelliJ IDEA 控制臺(tái)輸出中文亂碼問題的解決方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-05-05

最新評論

沭阳县| 拜泉县| 永胜县| 北安市| 精河县| 富民县| 隆安县| 屏东县| 沾化县| 淮安市| 石林| 姚安县| 龙门县| 七台河市| 清水河县| 旺苍县| 荣昌县| 团风县| 东乌| 柳林县| 汶川县| 哈尔滨市| 卫辉市| 宜兰县| 云和县| 凌云县| 巴彦淖尔市| 婺源县| 墨竹工卡县| 玉山县| 安吉县| 雷山县| 沽源县| 金平| 临安市| 临猗县| 闵行区| 鸡东县| 高青县| 武定县| 日喀则市|