Spring 框架中注入或替換方法實現(xiàn)
無狀態(tài) Bean 的作用域是 singleton 單實例,如果我們向 singleton 的 Bean A 注入 prototype 的 Bean B,并希望每次調(diào)用 Bean A 的 getBeanB() 時都能返回一個新的 Bean B ,這樣的要求使用傳統(tǒng)的注入方式是無法實現(xiàn)的 。 因為 singleton 的 Bean 注入關(guān)聯(lián) Bean 的動作只發(fā)生一次,雖然 Bean B 的作用域是 prototype 類型,但通過 getBeanB() 返回的對象還是最開始注入的那個 bean B。
所以如果希望每次調(diào)用 BeanA 的 getBeanB() 時都能返回一個新的 BeanB 的一種可選的方案是:讓 Bean A 實現(xiàn) BeanFactoryAware 接口,從而能夠訪問容器,然后以下面這種方式來實現(xiàn)。
首先配置 XML:
<bean id="author" class="net.deniro.spring4.bean.Author" scope="prototype"/> <bean id="book" class="net.deniro.spring4.bean.Book" p:name="面紗"> </bean>
bean author 的 scope 設(shè)置為 prototype。
Book 類實現(xiàn) BeanFactoryAware 接口:
public class Book implements BeanFactoryAware {
...
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.factory = beanFactory;
}
public Author getPrototypeAuthor() {
return (Author) factory.getBean("author");
}
}
單元測試:
ApplicationContext context;
@BeforeMethod
public void setUp() throws Exception {
context = new ClassPathXmlApplicationContext("beans5-5.xml");
}
@Test
public void test(){
Book book= (Book) context.getBean("book");
System.out.println(book.getAuthor().hashCode());
System.out.println(book.getAuthor().hashCode());
System.out.println(book.getPrototypeAuthor().hashCode());
System.out.println(book.getPrototypeAuthor().hashCode());
測試結(jié)果
從結(jié)果中可以發(fā)現(xiàn),只有從 BeanFactory 中獲取得到的 Author 實例是不同的。
這種實現(xiàn)把應用與 Spring 框架綁定在了一起,是否有更好的解決方案呢?有,就是注入方法。
1 注入方法
Spring 容器依賴于 CGLib 庫,所以可以在運行期動態(tài)操作 Class 的字節(jié)碼,比如動態(tài)地創(chuàng)建 Bean 的子類或?qū)崿F(xiàn)類。
BookInterface 接口:
public interface BookInterface {
Author getAuthor();
}
XML 配置:
<!-- 方法注入-->
<bean id="author" class="net.deniro.spring4.bean.Author" scope="prototype"
p:name="毛姆"
/>
<bean id="book2" class="net.deniro.spring4.bean.BookInterface">
<lookup-method name="getAuthor" bean="author"/>
</bean>
單元測試:
BookInterface book= (BookInterface) context.getBean("book2");
Assert.assertEquals("毛姆",book.getAuthor().getName());
Assert.assertTrue(book.getAuthor().hashCode()!=book.getAuthor().hashCode());
通過這種配置方式,就可以為接口提供動態(tài)實現(xiàn)啦,而且這樣返回的 Bean 都是新的實例。
所以,如果希望在一個 singleton Bean 中獲取一個 prototype Bean 時,就可以使用 lookup 來實現(xiàn)注入方法。
2 替換方法
在 Spring 中,可以使用某個 Bean 的方法去替換另一個 Bean 的方法。
假設(shè) Book 中有一個 getName() 方法,用于獲取書名:
/**
* 書名
*/
private String name;
public String getName() {
return name;
}
我們現(xiàn)在新建一個 Bean,它實現(xiàn)了 MethodReplacer 接口,用于替換 Book 中的 getName() 方法:
public class Book4 implements MethodReplacer {
@Override
public Object reimplement(Object obj, Method method, Object[] args) throws Throwable {
return "活著";
}
}
配置:
<bean id="book3" class="net.deniro.spring4.bean.Book" p:name="燦爛千陽"> <replaced-method name="getName" replacer="book4"/> </bean> <bean id="book4" class="net.deniro.spring4.bean.Book4"/>
測試:
Book book= (Book) context.getBean("book3");
assertEquals("活著", book.getName());
總結(jié)
以上所述是小編給大家介紹的Spring 框架中注入或替換方法實現(xiàn),希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!
相關(guān)文章
Spring?Cloud?Alibaba?Nacos兩種檢查機制
這篇文章主要介紹了Spring?Cloud?Alibaba?Nacos兩種檢查機制,作為注冊中心不止提供了服務(wù)注冊和服務(wù)發(fā)現(xiàn)功能,它還提供了服務(wù)可用性監(jiān)測的機制,下面我們就一起進入文章了解具體詳情吧2022-05-05
mybatis generator 配置 反向生成Entity簡單增刪改查(推薦)
這篇文章主要介紹了mybatis generator 配置 反向生成Entity簡單增刪改查(推薦)的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-12-12
springboot?vue接口測試前后端實現(xiàn)模塊樹列表功能
這篇文章主要為大家介紹了springboot?vue接口測試前后端實現(xiàn)模塊樹列表功能,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05
Java實現(xiàn)FTP文件的上傳和下載功能的實例代碼
FTP 是File Transfer Protocol(文件傳輸協(xié)議)的英文簡稱,而中文簡稱為“文傳協(xié)議”。接下來通過本文給大家實例講解Java實現(xiàn)FTP文件的上傳和下載功能,需要的的朋友一起看看吧2016-11-11
Java中快速排序優(yōu)化技巧之隨機取樣、三數(shù)取中和插入排序
快速排序是一種常用的基于比較的排序算法,下面這篇文章主要給大家介紹了關(guān)于Java中快速排序優(yōu)化技巧之隨機取樣、三數(shù)取中和插入排序的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2023-09-09
SpringBoot最新定時任務(wù)的7種實現(xiàn)方案
在現(xiàn)代應用中,定時任務(wù)是一個非常常見的需求,本文將通過7種方式講解如何在SpringBoot中實現(xiàn)定時任務(wù),包括使用@Scheduled注解、ScheduledExecutorService、Quartz、SpringTaskScheduler、Redis、XXL-JOB和Elastic-Job等,各有優(yōu)缺點,選擇時應根據(jù)實際需求進行考慮2024-12-12
SpringBoot整合SpringSecurity認證與授權(quán)
在項目開發(fā)中,權(quán)限認證是很重要的,尤其是一些管理類的系統(tǒng),對于權(quán)限要求更為嚴格,本文主要介紹了SpringBoot整合SpringSecurity認證與授權(quán),感興趣的可以了解一下2023-11-11

