【深入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 IoC(二)BeanClass
引言 上篇部落格講到的是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/servlet】jsp資料互動(二)
本章目標: 掌握application的原理及應用 掌握物件的作用域 掌握cookie的原理及應用 使用jsp訪問資料庫 1、application物件 類似於系統的“全域性變數”,用於同一個伺服器內的所有使用者之間的資料共享,對於整個web伺服器,a
【Cloud Foundry】Could 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 Learning(二)Deep 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 IoC(一)Bean
引言 小賈推薦了一個Tiny Spring給我,學習Spring原始碼,從簡單的瞭解Bean,BeanDefinition和BeanFactory三者關 系開始,簡單易懂,這裡也以部落格的形
【spring】BeanFactory原始碼+例項(下)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 是我 很大的 《深入計算機系統》筆記(一)主要是講解程序的構成、執行和控制。接下來就是運行了。我跳過了“處理器體系結構”和“優化程序性能”,這兩章的筆記繼續往後延遲! 《深入計算機系統》的一個很大的用處