最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring 框架中注入或替換方法實(shí)現(xiàn)

 更新時(shí)間:2018年05月05日 15:12:57   作者:deniro  
這篇文章主要介紹了Spring 框架中注入或替換方法實(shí)現(xiàn),非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧

無(wú)狀態(tài) Bean 的作用域是 singleton 單實(shí)例,如果我們向 singleton 的 Bean A 注入 prototype 的 Bean B,并希望每次調(diào)用 Bean A 的 getBeanB() 時(shí)都能返回一個(gè)新的 Bean B ,這樣的要求使用傳統(tǒng)的注入方式是無(wú)法實(shí)現(xiàn)的 。 因?yàn)?singleton 的 Bean 注入關(guān)聯(lián) Bean 的動(dòng)作只發(fā)生一次,雖然 Bean B 的作用域是 prototype 類(lèi)型,但通過(guò) getBeanB() 返回的對(duì)象還是最開(kāi)始注入的那個(gè) bean B。

所以如果希望每次調(diào)用 BeanA 的 getBeanB() 時(shí)都能返回一個(gè)新的 BeanB 的一種可選的方案是:讓 Bean A 實(shí)現(xiàn) BeanFactoryAware 接口,從而能夠訪問(wèn)容器,然后以下面這種方式來(lái)實(shí)現(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 類(lèi)實(shí)現(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");
  }
}

單元測(cè)試:

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());

測(cè)試結(jié)果

從結(jié)果中可以發(fā)現(xiàn),只有從 BeanFactory 中獲取得到的 Author 實(shí)例是不同的。

這種實(shí)現(xiàn)把應(yīng)用與 Spring 框架綁定在了一起,是否有更好的解決方案呢?有,就是注入方法。

1 注入方法

Spring 容器依賴于 CGLib 庫(kù),所以可以在運(yùn)行期動(dòng)態(tài)操作 Class 的字節(jié)碼,比如動(dòng)態(tài)地創(chuàng)建 Bean 的子類(lèi)或?qū)崿F(xiàn)類(lèi)。

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>

單元測(cè)試:

BookInterface book= (BookInterface) context.getBean("book2");
Assert.assertEquals("毛姆",book.getAuthor().getName());
Assert.assertTrue(book.getAuthor().hashCode()!=book.getAuthor().hashCode());

通過(guò)這種配置方式,就可以為接口提供動(dòng)態(tài)實(shí)現(xiàn)啦,而且這樣返回的 Bean 都是新的實(shí)例。

 所以,如果希望在一個(gè) singleton Bean 中獲取一個(gè) prototype Bean 時(shí),就可以使用 lookup 來(lái)實(shí)現(xiàn)注入方法。

2 替換方法

在 Spring 中,可以使用某個(gè) Bean 的方法去替換另一個(gè) Bean 的方法。

假設(shè) Book 中有一個(gè) getName() 方法,用于獲取書(shū)名:

/**
 * 書(shū)名
 */
private String name;
public String getName() {
  return name;
}

我們現(xiàn)在新建一個(gè) Bean,它實(shí)現(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="燦爛千陽(yáng)">
  <replaced-method name="getName" replacer="book4"/>
</bean>
<bean id="book4" class="net.deniro.spring4.bean.Book4"/>

測(cè)試:

Book book= (Book) context.getBean("book3");
assertEquals("活著", book.getName());

總結(jié)

以上所述是小編給大家介紹的Spring 框架中注入或替換方法實(shí)現(xiàn),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!

相關(guān)文章

  • 在Eclipse中更改maven項(xiàng)目名的方法

    在Eclipse中更改maven項(xiàng)目名的方法

    今天小編就為大家分享一篇關(guān)于在Eclipse中更改maven項(xiàng)目名的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • Spring?Cloud?Alibaba?Nacos兩種檢查機(jī)制

    Spring?Cloud?Alibaba?Nacos兩種檢查機(jī)制

    這篇文章主要介紹了Spring?Cloud?Alibaba?Nacos兩種檢查機(jī)制,作為注冊(cè)中心不止提供了服務(wù)注冊(cè)和服務(wù)發(fā)現(xiàn)功能,它還提供了服務(wù)可用性監(jiān)測(cè)的機(jī)制,下面我們就一起進(jìn)入文章了解具體詳情吧
    2022-05-05
  • mybatis generator 配置 反向生成Entity簡(jiǎn)單增刪改查(推薦)

    mybatis generator 配置 反向生成Entity簡(jiǎn)單增刪改查(推薦)

    這篇文章主要介紹了mybatis generator 配置 反向生成Entity簡(jiǎn)單增刪改查(推薦)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12
  • springboot?vue接口測(cè)試前后端實(shí)現(xiàn)模塊樹(shù)列表功能

    springboot?vue接口測(cè)試前后端實(shí)現(xiàn)模塊樹(shù)列表功能

    這篇文章主要為大家介紹了springboot?vue接口測(cè)試前后端實(shí)現(xiàn)模塊樹(shù)列表功能,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Java實(shí)現(xiàn)FTP文件的上傳和下載功能的實(shí)例代碼

    Java實(shí)現(xiàn)FTP文件的上傳和下載功能的實(shí)例代碼

    FTP 是File Transfer Protocol(文件傳輸協(xié)議)的英文簡(jiǎn)稱,而中文簡(jiǎn)稱為“文傳協(xié)議”。接下來(lái)通過(guò)本文給大家實(shí)例講解Java實(shí)現(xiàn)FTP文件的上傳和下載功能,需要的的朋友一起看看吧
    2016-11-11
  • Java中快速排序優(yōu)化技巧之隨機(jī)取樣、三數(shù)取中和插入排序

    Java中快速排序優(yōu)化技巧之隨機(jī)取樣、三數(shù)取中和插入排序

    快速排序是一種常用的基于比較的排序算法,下面這篇文章主要給大家介紹了關(guān)于Java中快速排序優(yōu)化技巧之隨機(jī)取樣、三數(shù)取中和插入排序的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • Spring中@Conditional注解的用法

    Spring中@Conditional注解的用法

    這篇文章主要介紹了Spring中@Conditional注解的用法,@Conditional是Spring4新提供的注解,它的作用是按照一定的條件進(jìn)行判斷,滿足條件給容器注冊(cè)bean,需要的朋友可以參考下
    2024-01-01
  • 了解Java線程池執(zhí)行原理

    了解Java線程池執(zhí)行原理

    那么有沒(méi)有一種辦法使得線程可以復(fù)用,就是執(zhí)行完一個(gè)任務(wù),并不被銷(xiāo)毀,而是可以繼續(xù)執(zhí)行其他的任務(wù)?在Java中可以通過(guò)線程池來(lái)達(dá)到這樣的效果。下面我們來(lái)詳細(xì)了解一下吧
    2019-05-05
  • SpringBoot最新定時(shí)任務(wù)的7種實(shí)現(xiàn)方案

    SpringBoot最新定時(shí)任務(wù)的7種實(shí)現(xiàn)方案

    在現(xiàn)代應(yīng)用中,定時(shí)任務(wù)是一個(gè)非常常見(jiàn)的需求,本文將通過(guò)7種方式講解如何在SpringBoot中實(shí)現(xiàn)定時(shí)任務(wù),包括使用@Scheduled注解、ScheduledExecutorService、Quartz、SpringTaskScheduler、Redis、XXL-JOB和Elastic-Job等,各有優(yōu)缺點(diǎn),選擇時(shí)應(yīng)根據(jù)實(shí)際需求進(jìn)行考慮
    2024-12-12
  • SpringBoot整合SpringSecurity認(rèn)證與授權(quán)

    SpringBoot整合SpringSecurity認(rèn)證與授權(quán)

    在項(xiàng)目開(kāi)發(fā)中,權(quán)限認(rèn)證是很重要的,尤其是一些管理類(lèi)的系統(tǒng),對(duì)于權(quán)限要求更為嚴(yán)格,本文主要介紹了SpringBoot整合SpringSecurity認(rèn)證與授權(quán),感興趣的可以了解一下
    2023-11-11

最新評(píng)論

徐闻县| 新田县| 敖汉旗| 大竹县| 尤溪县| 新兴县| 新宾| 岚皋县| 信丰县| 成武县| 道孚县| 南江县| 芦山县| 莆田市| 五台县| 香河县| 库伦旗| 昌都县| 城步| 剑河县| 福泉市| 连平县| 泌阳县| 宜丰县| 龙游县| 承德市| 施甸县| 衡东县| 营口市| 涞源县| 高要市| 卓资县| 武陟县| 沙雅县| 商城县| 奎屯市| 永泰县| 宁乡县| 贡嘎县| 库尔勒市| 鸡泽县|