Spring lookup method方法注入

2021-08-26 05:32:33 字數 2313 閱讀 4441

一.spring中bean的狀態

二.問題的引出

假設乙個單例的bean a需要引用乙個非單例模式的bean b,那麼在每次引用b的時候都想拿到乙個新的b,該怎麼做?要知道,bean a是單例模式的,只會被建立一次,注入一次屬性,也就是說,即使b是property模式,那也是只會乙個相同的b,因為a只會被注入一次。

2.lookup-method方法注入

下面我們用乙個例子來說明lookup-method的用法。

假設有乙個果盤,果盤裡放了一些水果,比如蘋果,香蕉等,我們希望我們每次在果盤裡拿到的都是最新鮮的水果。

// 定義乙個水果類

public

class

fruit

}// 蘋果

public

class

extends

fruit

}// 香蕉

public

class

banana

extends

fruit

}// 水果盤,可以拿到水果

public

abstract

class

fruitplate

spring配置:

scope="prototype"/>

id="bananer"

class="cn.com.willchen.test.di.bananer "

scope="prototype"/>

id="fruitplate1"

class="cn.com.willchen.test.di.fruitplate">

name="getfruit"

bean>

id="fruitplate2"

class="cn.com.willchen.test.di.fruitplate">

name="getfruit"

bean="banana"/>

bean>

測試**:

public

static

void

main(string args)

從上面例子我們可以看到,在**中,我們沒有用到spring的任何類和介面,實現了與spring**的解耦。其中,最為核心的部分就是lookup-method的配置和fruitplate.getfruit()方法。上面**中,我們可以看到getfruit()方法是個抽象方法,我們並沒有實現它啊,那它是怎麼拿到水果的呢。這裡的奧妙就是srping應用了cglib(動態**)類庫。spring在初始化容器的時候對配置的bean做了特殊處理,spring會對bean指定的class做動態**,**標籤中name屬性所指定的方法,返回bean屬性指定的bean例項物件。每次我們呼叫fruitplate1或者fruitplate2這2個bean的getfruit()方法時,其實是呼叫了cglib生成的動態**類的方法。關於cglib大家可自行在網上查閱。

lookup-method實現方式說明:

class="beanclass">

name="method"

bean="non-singleton-bean"/>

bean>

method是beanclass中的乙個方法,beanclass和method是不是抽象都無所謂,不會影響cglib的動態**,根據專案實際需求去定義。non-singleton-bean指的是lookup-method中bean屬性指向的必須是乙個非單例模式的bean,當然如果不是也不會報錯,只是每次得到的都是相同引用的bean(同乙個例項),這樣用lookup-method就沒有意義了。

另外對於method在**中的簽名有下面的標準:

[abstract] themethodname(no-arguments);

public|protected要求方法必須是可以被子類重寫和呼叫的;

abstract可選,如果是抽象方法,cglib的動態**類就會實現這個方法,如果不是抽象方法,就會覆蓋這個方法,所以沒什麼影響;

return-type就是non-singleton-bean的型別咯,當然可以是它的父類或者介面。

no-arguments不允許有引數。

3.使用@lookup註解

@target(elementtype.method)

@retention(retentionpolicy.runtime)

@documented

public @inte***ce

lookup

BigDecimal中divide方法注意問題

在使用 bigdecimal rate new bigdecimal 1 divide new bigdecimal 3 時拋異常 non terminating decimal expansion no exact representable decimal result原來是在做除法的時候出現了...

Hibernate中update方法的注意點

hibernate 中如果直接使用 session.update object o 會把這個表中的所有字段更新一遍。public class teachertest hibernate 執行的sql語句 hibernate update teacher setage birthday name ti...

Iterator的remove 方法使用注意事項

voidremove 從迭代器指向的集合中移除迭代器返回的最後乙個元素 可選操作 每次呼叫 next 只能呼叫一次此方法,也意味著在呼叫remove 之前必須先呼叫next 如果進行迭代時用呼叫此方法之外的其他方式修改了該迭代器所指向的集合,則迭代器的行為是不明確的。丟擲 unsupportedop...