1. 程式人生 > >FactoryBean結合@Autowired和@Resource的使用產生的問題深究(一)

FactoryBean結合@Autowired和@Resource的使用產生的問題深究(一)

前言

最近在使用FactoryBean的時候遇到了一些問題,在這裡記錄一下:首先是不明白FactoryBean的使用,查詢了資料很快也明白了它的原理,然後就是結合@Autowired和@Resource註解使用的時候出現了一些問題。

FactoryBean的使用

spring的xml檔案中定義bean的時候,並不總是返回定義的型別的bean,有時候是它的產物,FactoryBean就是這樣。FactoryBean比較適用的一個場景是:當一個類比較複雜,使用java編碼比使用xml配置更容易表達,這個時候把這個類當作FactoryBean的產物比較方便。
下面看具體的使用:
首先定義一個實體類:

public class Tool {
    private int id;

    public Tool() {
    }

    public Tool(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
    @Override
    public String toString() {
        return "Tool{"
+ "id=" + id + '}'; } }

ToolFactory實現FactoryBean介面:

public class ToolFactory implements FactoryBean<Tool> {

    private int factoryId;
    private int toolId;

    public ToolFactory() {
    }

    public ToolFactory(int factoryId, int toolId) {
        this
.factoryId = factoryId; this.toolId = toolId; } /**返回本工廠建立的物件例項。此例項也許是共享的, *依賴於該工廠返回的是單例或者是原型 */ @Override public Tool getObject() throws Exception { return new Tool(toolId); } //返回物件型別 @Override public Class<?> getObjectType() { return Tool.class; } //如果FactoryBean返回的是單例,該方法返回值為true,否則為false @Override public boolean isSingleton() { return false; } public int getFactoryId() { return factoryId; } public void setFactoryId(int factoryId) { this.factoryId = factoryId; } public int getToolId() { return toolId; } public void setToolId(int toolId) { this.toolId = toolId; } @Override public String toString() { return "ToolFactory{" + "factoryId=" + factoryId + ", toolId=" + toolId + '}'; } }

配置檔案如下:

 <bean id="tool" class="pojo.ToolFactory">
        <property name="factoryId" value="9090"/>
        <property name="toolId" value="1"/>
     </bean>

測試的時候如下:

   public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "classpath:applicationContext.xml");
        Object z =  context.getBean("tool");//返回產物bean
        Object v =  context.getBean("&tool");//返回FactoryBean型別
        System.out.println(z.toString());
        System.out.println(v.toString());

    }

最後輸出結果:
在這裡插入圖片描述

到此FactoryBean的 簡單使用就說完了,我講的比較簡單,如果大家想深究FactoryBean的原理可以看一下原始碼,或者搜尋其他優秀博主的文章。接下來我想講的是FactoryBean使用註解的時候遇到的問題,參見下一篇文章:
https://blog.csdn.net/u014473112/article/details/84309965