1. 程式人生 > >【Spring:FactoryBean介面】實現FactoryBean介面,Spring在初始化bean時有何不同

【Spring:FactoryBean介面】實現FactoryBean介面,Spring在初始化bean時有何不同

問題描述:

最近想要再次熟悉一下阿里中介軟體HSF的用法,在消費HSF時需要在Spring的配置檔案中進行如下配置:

<bean id="myClassB" class="com.taobao.hsf.app.spring.util.HSFSpringConsumerBean">
   <property name="interfaceName">
      <value>com.lican.Myclass</value>
   </property>
   <property name="version">
      <value
>
${refundplatform.provide.service.version}</value> </property> <property name="group"> <value>${refundplatform.hsf.provide.serviceGroup}</value> </property> </bean>

而後在程式碼中這樣使用:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"
); MyClassB myClassB = (MyClassB) context.getBean("myClassB"); myClassB.function();

在所有消費hsf的地方,spring的配置處,class屬性均是HSFSpringConsumerBean類,可是眾所周知,spring在使用如下方法:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

MyClassB myClassB = (MyClassB) context.getBean("myClassB"
);

進行bean的初始化時,按照class屬性進行,那麼為何我們將class屬性設定為HSFSpringConsumerBean,卻在程式中可以得到相應的服務代理類,從而進行服務的呼叫。後來進行資料的查閱以及HSFSpringConsumerBean類原始碼的閱讀,發現HSFSpringConsumerBean類實現了FactoryBean介面,而實現該介面可以在Spring建立bean時實現其他型別,在HSFSpringConsumerBean類中,實際上生成的是一個實現了指定介面的代理類。實現FactoryBean介面,需要實現三個方法,看下介面FactoryBean的原始碼:

public interface FactoryBean<T> {  

   /** 
    * 獲取實際要返回的bean物件。 
    * @return 
    * @throws Exception 
    */  
   T getObject() throws Exception;  

   /** 
    * 獲取返回的物件型別 
    * @return 
    */  
   Class<?> getObjectType();  

   /** 
    * 是否單例 
    * @return 
    */  
   boolean isSingleton();  

} 

自己再寫一個例子實驗一下:

package study20170323;

import org.springframework.beans.factory.FactoryBean;

/**
 * Created by apple on 17/3/23.
 */
public class MyClassA implements FactoryBean {
    @Override
    public Object getObject() throws Exception {
        MyClassB myClassB = new MyClassB();
        return myClassB;
    }

    @Override
    public Class<?> getObjectType() {
        return MyClassB.class;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }
}
package study20170323;

/**
 * Created by apple on 17/3/23.
 */
public class MyClassB {
}
package study20170323;


import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created by apple on 17/3/23.
 */
public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        MyClassB myClassB = (MyClassB) context.getBean("myClassB");
        System.out.println(myClassB.getClass().getName());

    }
}

在spring的配置中進行如下配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
        default-autowire="byName" default-lazy-init="true">
   <bean id="myClassB" class="study20170323.MyClassA"></bean>

</beans>

輸出結果為:

這裡寫圖片描述

當然,如果想要直接獲取FactoryBean實現類本身的例項時,可以這樣寫

context.getBean("&myClassB");

相關推薦

SpringFactoryBean介面實現FactoryBean介面Spring初始bean時有不同

問題描述: 最近想要再次熟悉一下阿里中介軟體HSF的用法,在消費HSF時需要在Spring的配置檔案中進行如下配置: <bean id="myClassB" class="com.taobao.hsf.app.spring.util.HSFSpri

spring原始碼(一) springmvc啟動過程springmvc初始過程

spring mvc配置 我們知道要想使用springmvc,一般需要配置如下 web.xml中配置ContextLoaderListener來載入spring根配置檔案。 <web-app> <context-param&g

java實現Comparable介面和Comparator介面並重寫compareTo方法和compare方法

實現Comparable介面和Comparator介面,並重寫compareTo方法和compare方法 2016年08月11日 14:39:25 蘇尹 閱讀數:10772更多 個人分類: 學習筆記 實體類:java.lang.Comparable(介面) + coma

PHP+MYSQL實現登入介面的學習筆記

目標 利用php和MySQL實現登入介面 工具 1.wampserver(簡單易上手的整合安裝環境!) 2.notepad++(或dw,嫌麻煩記事本也可以!) 步驟 一、首先安裝wampserver 第一步:在百度軟體中心下載wampserver 第二步:安裝 安裝過程很

spring詳解通過FactoryBean自定義工廠初始Bean

FactoryBean的作用: FactoryBean是一個介面,擴充套件功能提供給使用者自定義工廠方法和工廠物件用於例項化物件。 FactoryBean定義了3個方法介面: T getObject():自定義的工廠方法; booleanisSingleton():定義B

Spring學習筆記4三種做屬性連線的Annotation,指示初始和銷燬方法的Annotation

屬性連線 屬性連線是指配置DI的方式,之前學了可以在<bean ...></bean>裡面使用<constructor-arg .../>和<property .../> 元素做屬性連線。 Spring裡還可以

C++實現圖形介面五子棋

圖形介面的五子棋就是在普通“黑框框”下面實現五子棋的基礎上引用了圖形庫,本文不在這裡介紹相應的圖形庫。 下面給出程式碼: #include<graphics.h> #include<conio.h> #include<windows.h>

Spring原始碼分析系列ApplicationContext 相關介面架構分析

在使用Spring的時候,我們經常需要先得到一個ApplicationContext物件,然後從該物件中獲取我們配置的Bean物件

java項目實戰ThreadLocal封裝Connection實現同一線程共享資源

auth @override api 數據 學習 pow 當前 程序 word 線程安全一直是程序員們關註的焦點。多線程也一直是比較讓人頭疼的話題,想必大家以前也遇到過各種各種的問題。我就不再累述了。當然,解決方案也有非常多,這篇博文給大家提供一種非常好的

編寫高質量代碼改善C#程序的157個建議——建議19使用更有效的對象和集合初始

color 有效 void ons ron public 類型 通過 esc 建議19:使用更有效的對象和集合初始化 依賴於屬性和FCL 3.5之後的語法規則,現在我們有了更加簡潔有效的對象和集合初始化機制:對象和集合初始化設定項。 對象初始化: class

微信小程式--bindtap引數傳遞配合wx.previewImage實現多張縮圖預覽

  本文為原創隨筆,純屬個人理解。如有錯誤,歡迎指出。 如需轉載請註明出處 在微信小程式中預覽圖片分為   a、預覽本地相簿中的圖片。   b、預覽某個wxml中的多張圖片。 分析:實質其實是一樣的。都是給wx.previewImage傳入引數

除錯除錯工具 Windbg的gflags.exe 和 pageheap的使用和原理分析

PageHeap / Gflags 使用,溢位容易用到   堆除錯工具——pageheap的使用和原理分析 今天除錯一個bug,用pageheap解決,在此記錄一下。 bug症狀如下: 1:不確定性崩潰,用vs除錯啟動每次崩潰地點都在crt分配或者釋放堆的位置 2:崩潰時v

Mac + ATX基於uiautomator2使用weditor時報錯requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(54, 'Connection r

  之前講過怎麼安裝u2(【Mac安裝,ATX基於uiautomator2】之安裝步驟)以及使用weditor, 但是經過一段時間,weditor不用的時候再打開發現,報錯了: requests.exceptions.ConnectionError: ('Connection aborted.

機器人學運動規劃OMPL開源運動規劃庫的安裝和demo

開源運動規劃庫(OMPL)是美國萊斯大學的kavrakilab開發的,包含了當下主流的運動規劃器。對於機器人方向的同學來說,無論是做移動機器人還是機械臂,這是必須要學習的工具。 在ubuntu14.04環境下,安裝OMPL是比較簡單的。 首先進入OMPL的官網http:/

機器人學運動規劃快速搜尋隨機樹(RRT---Rapidly-exploring Random Trees)入門及在Matlab中演示

  快速搜尋隨機樹(RRT -Rapidly-ExploringRandom Trees),是一種常見的用於機器人路徑(運動)規劃的方法,它本質上是一種隨機生成的資料結構—樹,這種思想自從LaValle在[1]中提出以後已經得到了極大的發展,到現在依然有改進的RRT不斷地被提出來。

.net 4.5版本MVVM模式下ViewModel基類使用CallerMemberName優雅實現INotifyPropertyChanged介面

using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; namespace SSMart_Model {     /// &

EFaulty Factorial(數論迴圈節)

**題意**:在1*2*3*......*n中改變一個數為比它小的數,使得%p等於r.輸出任意一個解 2<=n&&n<=1e18 2<=p&&p<1e7 **分析**:n很大,從p入手,考慮迴圈節。但是真的很暴

口胡對偶問題Codeforces 671DJZOJ 5369 幽雅的綻放吧墨染之櫻

Description 給定一顆N個節點的樹,現在有M個工人,每個工人有三個屬性ui,vi,Ci,表示這名工人可以維修節點ui到節點vi的所有路徑,花費為Ci,並且保證vi是ui的祖先(祖先後代鏈)。問最少花費多少使得樹上的每條邊都有人維修。 N,M≤30000