欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring之IOC詳解

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

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

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

好了下面我們開(kāi)始我的業(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;
 }
}

有了我們的用戶對(duì)象,下面我們開(kāi)始創(chuàng)建Selvect類(lèi),Selvect我們知道,使用了接收用戶請(qǐng)求的對(duì)象,這里因?yàn)槲覀冎皇菫榱朔奖愦蠹依斫?,所以我們?cè)赟elvect中模擬收到用戶請(qǐng)求后進(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");//通過(guò)類(lèi)名來(lái)獲得類(lèi)對(duì)象
  userService.add(userDO);//完成業(yè)務(wù)邏輯
 }
}

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

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

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

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

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

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

好了到這里我們的基本框架已經(jīng)完成,接下來(lái)就要開(kāi)始重點(diǎn)的內(nèi)容了,首先我們需要先了解一些關(guān)于xml解析的知識(shí),在之前的博客中已經(jīng)為大家介紹了過(guò)一種方式:Jdom讀取XML文件,不了解的小伙伴可以先移步簡(jiǎn)單查看一下,這樣接下來(lái)的內(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工程對(duì)象,用來(lái)讀取我們的Spring.xml文件,從而完成對(duì)象實(shí)例的創(chuàng)建,一便接下來(lái)的業(yè)務(wù)操作:

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

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

public class ClassPathXmlApplicationContext implements BeanFactory{
 private Map<String, Object> beanMap = new HashMap<String, Object>();//用來(lái)存配置文件中的類(lèi)對(duì)象
 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的類(lèi)名地址
    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接口類(lèi)
     m.invoke(object, beanObject);//調(diào)用UserService的SetUserDao()方法,傳入U(xiǎn)serDaoImpl
    }
   }
  } catch (Exception e) {
   System.out.println("" + e);
  }
 }
 //用于類(lèi)調(diào)用
 @Override
 public Object getBean(String className) {
  return beanMap.get(className);
 }
}

簡(jiǎn)單為大家介紹一下,我們通過(guò)beanMap將我們?cè)赟pring中配置的對(duì)象,通過(guò)反射機(jī)制拿到,然后放置于beanMap對(duì)象中,通過(guò)getBean方法,共外部類(lèi)調(diào)用。

上面簡(jiǎn)單模擬了一下Spring中IOC的一些內(nèi)容,下面咱們一起來(lái)看一下,如何通過(guò)Spring完成上面的操作,首先我們需要下載spring.jar,有了這個(gè)jar還不夠,spring還依賴commons-logging.jar,好了將這兩個(gè)jar包導(dǎo)入到我們的工程中,然后我們就來(lái)看一下如何實(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);
 }
}

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

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

相關(guān)文章

  • Java啟動(dòng)命令大全(匯總)

    Java啟動(dòng)命令大全(匯總)

    Java啟動(dòng)命令是所有java應(yīng)用程序的入口,通過(guò)它來(lái)啟動(dòng)Java運(yùn)行時(shí)環(huán)境,并加載相關(guān)的class,本文希望做一個(gè)Java啟動(dòng)命令的匯總,和各位同道分享,也便于日后作為自己的參考
    2023-09-09
  • Quartz中的Job與JobDetail解析

    Quartz中的Job與JobDetail解析

    這篇文章主要介紹了Quartz中的Job與JobDetail解析,你定義了一個(gè)實(shí)現(xiàn)Job接口的類(lèi),這個(gè)類(lèi)僅僅表明該job需要完成什么類(lèi)型的任務(wù),除此之外,Quartz還需要知道該Job實(shí)例所包含的屬性;這將由JobDetail類(lèi)來(lái)完成,需要的朋友可以參考下
    2023-11-11
  • java利用delayedQueue實(shí)現(xiàn)本地的延遲隊(duì)列

    java利用delayedQueue實(shí)現(xiàn)本地的延遲隊(duì)列

    這篇文章主要給大家介紹了java利用delayedQueue實(shí)現(xiàn)本地的延遲隊(duì)列的相關(guān)資料,文中介紹的非常詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-04-04
  • 淺談JAVA工作流的優(yōu)雅實(shí)現(xiàn)方式

    淺談JAVA工作流的優(yōu)雅實(shí)現(xiàn)方式

    這篇文章主要介紹了淺談JAVA工作流的優(yōu)雅實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Spring Security學(xué)習(xí)筆記(一)

    Spring Security學(xué)習(xí)筆記(一)

    這篇文章主要介紹了Spring Security的相關(guān)資料,幫助大家開(kāi)始學(xué)習(xí)Spring Security框架,感興趣的朋友可以了解下
    2020-09-09
  • 利用Thumbnailator輕松實(shí)現(xiàn)圖片縮放、旋轉(zhuǎn)與加水印

    利用Thumbnailator輕松實(shí)現(xiàn)圖片縮放、旋轉(zhuǎn)與加水印

    java開(kāi)發(fā)中經(jīng)常遇到對(duì)圖片的處理,JDK中也提供了對(duì)應(yīng)的工具類(lèi),不過(guò)處理起來(lái)很麻煩,Thumbnailator是一個(gè)優(yōu)秀的圖片處理的開(kāi)源Java類(lèi)庫(kù),處理效果遠(yuǎn)比Java API的好,這篇文章主要介紹了利用Thumbnailator如何輕松的實(shí)現(xiàn)圖片縮放、旋轉(zhuǎn)與加水印,需要的朋友可以參考下
    2017-01-01
  • Java微信公眾平臺(tái)開(kāi)發(fā)(5) 文本及圖文消息回復(fù)的實(shí)現(xiàn)

    Java微信公眾平臺(tái)開(kāi)發(fā)(5) 文本及圖文消息回復(fù)的實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺(tái)開(kāi)發(fā)第五步,回文本及圖文消息回復(fù)的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Java線程池框架核心代碼解析

    Java線程池框架核心代碼解析

    這篇文章主要針對(duì)Java線程池框架核心代碼進(jìn)行詳細(xì)解析,分析Java線程池框架的實(shí)現(xiàn)ThreadPoolExecutor,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Maven 的配置文件路徑讀取方法

    Maven 的配置文件路徑讀取方法

    這篇文章主要介紹了Maven 的配置文件路徑讀取方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • SpringBoot讀取properties文件配置項(xiàng)過(guò)程解析

    SpringBoot讀取properties文件配置項(xiàng)過(guò)程解析

    這篇文章主要介紹了SpringBoot讀取properties文件配置項(xiàng)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06

最新評(píng)論