1. 程式人生 > >【深入Spring】——Tiny Spring IoC(二)BeanClass

【深入Spring】——Tiny Spring IoC(二)BeanClass

  引言

  上篇部落格講到的是Spring裡的基礎Bean,BeanDefinition與BeanFactory三者之間的簡單關係,這裡主要在此基礎

上新增BeanClass的內容,這裡順便提一個問題大家思想下,我會在總結裡給出答案的。

  問:Bean,BeanClass與BeanClassName三者之間有什麼關係?

  先上圖:

  UML圖

  類圖:

  

  時序圖:

  這裡已經將BeanFactory恢復為介面了,AutowireCapableBeanFactory作為實現類,繼承抽象類

AbstractBeanFactory中的doCreateBean(),而doCreateBean方法是註冊Bean的關鍵程式碼。

  下邊看程式碼部分吧~

  BeanDefinition

package us.codecraft.tinyioc;

/**
 * @author [email protected]
 */
public class BeanDefinition {

	private Object bean;

	private Class beanClass;

	private String beanClassName;

	public BeanDefinition() {
	}

	public void setBean(Object bean) {
		this.bean = bean;
	}

	public Class getBeanClass() {
		return beanClass;
	}

	public void setBeanClass(Class beanClass) {
		this.beanClass = beanClass;
	}

	public String getBeanClassName() {
		return beanClassName;
	}

	public void setBeanClassName(String beanClassName) {
		this.beanClassName = beanClassName;
		try {
			this.beanClass = Class.forName(beanClassName);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	public Object getBean() {
		return bean;
	}

}


  BeanFactory

package us.codecraft.tinyioc.factory;

import us.codecraft.tinyioc.BeanDefinition;

/**
 * @author [email protected]
 */
public interface BeanFactory {

    Object getBean(String name);

    void registerBeanDefinition(String name, BeanDefinition beanDefinition);
}


  AbstractBeanFactory

package us.codecraft.tinyioc.factory;

import us.codecraft.tinyioc.BeanDefinition;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author [email protected]
 */
public abstract class AbstractBeanFactory implements BeanFactory {

	private Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>();

	@Override
    public Object getBean(String name) {
		return beanDefinitionMap.get(name).getBean();
	}

	@Override
    public void registerBeanDefinition(String name, BeanDefinition beanDefinition) {
        Object bean = doCreateBean(beanDefinition);
        beanDefinition.setBean(bean);
        beanDefinitionMap.put(name, beanDefinition);
	}

    /**
     * 初始化bean
     * @param beanDefinition
     * @return
     */
    protected abstract Object doCreateBean(BeanDefinition beanDefinition);

}

  

  AutowireCapableBeanFactory

package us.codecraft.tinyioc.factory;

import us.codecraft.tinyioc.BeanDefinition;

/**
 * @author [email protected]
 */
public class AutowireCapableBeanFactory extends AbstractBeanFactory {

    @Override
    protected Object doCreateBean(BeanDefinition beanDefinition) {
        try {
            Object bean = beanDefinition.getBeanClass().newInstance();
            return bean;
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }
}

接下來是測試類:

  HelloWorldService

package us.codecraft.tinyioc;

/**
 * @author [email protected]
 */
public class HelloWorldService {

    public void helloWorld(){
        System.out.println("Hello World!");
    }
}


  BeanFactoryTest

package us.codecraft.tinyioc;

import org.junit.Test;
import us.codecraft.tinyioc.factory.AutowireCapableBeanFactory;
import us.codecraft.tinyioc.factory.BeanFactory;

/**
 * @author [email protected]
 */
public class BeanFactoryTest {

	@Test
	public void test() {
		// 1.初始化beanfactory
		BeanFactory beanFactory = new AutowireCapableBeanFactory();

		// 2.注入bean
		BeanDefinition beanDefinition = new BeanDefinition();
        beanDefinition.setBeanClassName("us.codecraft.tinyioc.HelloWorldService");
		beanFactory.registerBeanDefinition("helloWorldService", beanDefinition);

        // 3.獲取bean
        HelloWorldService helloWorldService = (HelloWorldService) beanFactory.getBean("helloWorldService");
        helloWorldService.helloWorld();

    }
}


  總結

  根據上邊的圖和程式碼,能看出來Bean,BeanClass和BeanClassName三者之間的關係了嗎?在測試類

BeanFactoryTest中可以看到setBeanClassName方法,引數是字串,字串的內容是HelloWorldService的物理全路

徑,在setBeanClassName方法內部,通過反射,將全路徑讀出,存入到BeanClass裡,並由BeanDefinition進行管

理,完成賦值過程。註冊部分與上篇部落格基本類似,這裡不再贅述。

  在上述整個方法裡有沒有看到不和諧的地方?HelloWorldService裡還是輸入的字串商量,在程式中當然是不允

許的,所以下篇部落格,我們將在BeanDefinition裡引入PropertyValue,期待吧~

相關推薦

深入Spring——Tiny Spring IoCBeanClass

  引言   上篇部落格講到的是Spring裡的基礎Bean,BeanDefinition與BeanFactory三者之間的簡單關係,這裡主要在此基礎 上新增BeanClass的內容,這裡順便提一個

筆記篇斜率優化dp SDOI2016征途

不能 最小化 征途 這樣的 string cpp mar logs -s =======傳=送=門======= 搜題目名會搜出很多奇怪的東西... 這個題目似乎有點毒? 比如在bzoj和loj上可以1A的代碼上會在luogu TLE 2個點, 在cogs TLE 10個

小說連載網絡紅顏:美女網絡工程師第一天上班就被燙傷了腳……

網絡 職場 美女 入職 簡介:這是一段描寫網絡工程師生活的故事。故事中沒有英雄,沒有勵誌,也沒有所謂的雞湯文化和狼性文化。有的,或許是一種對技術的執著,對愛情的渴望或者是對名利的一種追求,但又能追求到什麽呢?聲明:本故事所出現的人名,公司名均為虛構,如有雷同恰屬巧合小說將在本站博客和本人微信公

AI實戰快速掌握TensorFlow:計算圖、會話

在前面的文章中,我們已經完成了AI基礎環境的搭建(見文章:Ubuntu + Anaconda + TensorFlow + GPU + PyCharm搭建AI基礎環境),以及初步瞭解了TensorFlow的特點和基本操作(見文章:快速掌握TensorFlow(一)),接下來將繼續學習掌握Tenso

英語學習新概念英語單詞表

Lesson 1  private ['praivit] a.私人的  conversation [kɔnvə'seiʃən] n.談話  theatre  ['θiətə] n.劇場,戲院  seat [si:t] n.座位 play [plei] n.戲  lo

對話系統天氣對話機器人----- 關於Rasa踩過的那些坑

Rasa 是一個機器人對話開源框架,目前版本還在不斷迭代中。之前做的一個天氣對話機器人就是基於它的,這次我想來記錄一下用Rasa建立對話系統所遇到的坑。 1. 安裝  話說在Linux下rasa的安裝也不是啥難事,但是一定要注意選擇版本,由於其版本迭代過快,很

機器學習決策樹演算法— 程式碼實現

#coding=utf8 ‘’’ Created on 2018年11月4日 @author: xiaofengyang 決策樹演算法:ID3演算法 ‘’’ from sklearn.feature_extraction import DictVectorize

jsp/servletjsp資料互動

本章目標: 掌握application的原理及應用 掌握物件的作用域 掌握cookie的原理及應用 使用jsp訪問資料庫 1、application物件 類似於系統的“全域性變數”,用於同一個伺服器內的所有使用者之間的資料共享,對於整個web伺服器,a

Cloud FoundryCould Foundry學習——核心元件分析

在閱讀的過程中有任何問題,歡迎一起交流 QQ:1494713801 Cloud Foundry核心元件架構圖如下: 主要元件:     Cloud Controller:實質上是VMC和STS互動的伺服器端,它收到指令後發訊息到各模快,管理整個雲的執行,相當於Cl

Shell程式設計變數數值計算

OK,數值運算(上)是我看完的一小部分,大概的結束指令碼如下:(回顧~~) #!/bin/bash a=$1 b=$2 expr $1 + 1 &>/dev/null if [ "$

演算法題目遞迴題目求一個數組的子集

題目:求一個數組的子集 例子: 給出陣列 [a,b,c] 其子集就是 空、a、b、c、ab、ac、bc、abc 思路 這個問題實際上是一個遍歷樹的問題,進行遍歷每一個子元素,再進入下層函式時候記錄上層結果,加入到下層函式中,再儲存起來。由於ab和ba是

網路程式設計處理定時事件---利用訊號通知

前言 這篇的誕生也很不容易,感謝Jung Zhang學長和瑞神的橘子。 在上一篇,我們通過Redis對定時事件的處理有了一定的認識,今天我們繼續按照《高效能伺服器程式設計》上邊的思路,用C++來實現一個小demo。 本篇中,我們將利用alarm函式來完成定

面向程式碼學習 Deep LearningDeep Belief Nets(DBNs)

========================================================================================== 最近一直在看Deep Learning,各類部落格、論文看得不少 但是說實話,這樣做有

IOS學習CoreText學習筆記設定文字屬性和插入圖片

設定文字和圖片的方法: 繪製文字的步驟是:設定NSAttributedString 或NSMutableAttributedString——> 通過attributedString 生成frameSetter ——> 生成CTFrame——>畫出來設定文字

2018最新iOS面試題

1.VC的生命週期 init:初始化程式 loadView:檢視初始化 viewDidLoad:檢視載入完成 viewWillAppear:檢視即將顯示 viewDidAppear:檢視顯示時呼叫 viewWillDisappear:檢視即將消失

程式人生回憶職業生涯職場中程式設計師們一定要保護好自己

       “我們要公司的錢,公司要我們的命”!不知道您在自己的職業生涯中,是否碰到過或者聽到這樣的事情呢?             一大早在上班的路上,在公司附近的工廠門

深入Spring——Tiny Spring IoCBean

  引言   小賈推薦了一個Tiny Spring給我,學習Spring原始碼,從簡單的瞭解Bean,BeanDefinition和BeanFactory三者關 系開始,簡單易懂,這裡也以部落格的形

springBeanFactory原始碼+例項FactoryBean+依賴注入

前言:     原始碼+例項:你、值得擁有 3. FactoryBean介面 實現了FactoryBean介面的bean是一類叫做factory的bean。其特點是,spring會在使用getBean()呼叫獲得該bean時,會自動呼叫該bean的g

Spring MVC深度探險SpringMVC——框架介紹

一、前言       從這篇部落格開始小編就正式向打擊介紹一下SpringMVC這個輕量級的框架,既然是輕量級自然就可以單獨使用了。也許你可能問為什麼要使用Spring MVC,Struts 2.x不

3.2《深入理解計算機系統》筆記內存和高速緩存的原理插圖

img sram 本質 text ddr rate too 是我 很大的 《深入計算機系統》筆記(一)主要是講解程序的構成、執行和控制。接下來就是運行了。我跳過了“處理器體系結構”和“優化程序性能”,這兩章的筆記繼續往後延遲! 《深入計算機系統》的一個很大的用處