一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring 框架中注入或替換方法實現

Spring 框架中注入或替換方法實現

2021-04-26 14:09deniro Java教程

這篇文章主要介紹了Spring 框架中注入或替換方法實現,非常不錯,具有參考借鑒價值,感興趣的朋友跟隨腳本之家小編一起學習吧

無狀態 bean 的作用域是 singleton 單實例,如果我們向 singleton 的 bean a 注入 prototype 的 bean b,并希望每次調用 bean a 的 getbeanb() 時都能返回一個新的 bean b ,這樣的要求使用傳統的注入方式是無法實現的 。 因為 singleton 的 bean 注入關聯 bean 的動作只發生一次,雖然 bean b 的作用域是 prototype 類型,但通過 getbeanb() 返回的對象還是最開始注入的那個 bean b。

所以如果希望每次調用 beana 的 getbeanb() 時都能返回一個新的 beanb 的一種可選的方案是:讓 bean a 實現 beanfactoryaware 接口,從而能夠訪問容器,然后以下面這種方式來實現。

首先配置 xml:

?
1
2
3
4
<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 設置為 prototype。

book 類實現 beanfactoryaware 接口:

?
1
2
3
4
5
6
7
8
9
10
public class book implements beanfactoryaware {
 ...
@override
public void setbeanfactory(beanfactory beanfactory) throws beansexception {
  this.factory = beanfactory;
}
public author getprototypeauthor() {
  return (author) factory.getbean("author");
  }
}

單元測試:

?
1
2
3
4
5
6
7
8
9
10
11
12
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());

測試結果

從結果中可以發現,只有從 beanfactory 中獲取得到的 author 實例是不同的。

這種實現把應用與 spring 框架綁定在了一起,是否有更好的解決方案呢?有,就是注入方法。

1 注入方法

spring 容器依賴于 cglib 庫,所以可以在運行期動態操作 class 的字節碼,比如動態地創建 bean 的子類或實現類。

bookinterface 接口:

?
1
2
3
public interface bookinterface {
  author getauthor();
}

xml 配置:

?
1
2
3
4
5
6
7
<!-- 方法注入-->
<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>

單元測試:

?
1
2
3
bookinterface book= (bookinterface) context.getbean("book2");
assert.assertequals("毛姆",book.getauthor().getname());
assert.asserttrue(book.getauthor().hashcode()!=book.getauthor().hashcode());

通過這種配置方式,就可以為接口提供動態實現啦,而且這樣返回的 bean 都是新的實例。

 所以,如果希望在一個 singleton bean 中獲取一個 prototype bean 時,就可以使用 lookup 來實現注入方法。

2 替換方法

在 spring 中,可以使用某個 bean 的方法去替換另一個 bean 的方法。

假設 book 中有一個 getname() 方法,用于獲取書名:

?
1
2
3
4
5
6
7
/**
 * 書名
 */
private string name;
public string getname() {
  return name;
}

我們現在新建一個 bean,它實現了 methodreplacer 接口,用于替換 book 中的 getname() 方法:

?
1
2
3
4
5
6
public class book4 implements methodreplacer {
  @override
  public object reimplement(object obj, method method, object[] args) throws throwable {
    return "活著";
  }
}

配置:

?
1
2
3
4
5
<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"/>

測試:

?
1
2
book book= (book) context.getbean("book3");
assertequals("活著", book.getname());

總結

以上所述是小編給大家介紹的spring 框架中注入或替換方法實現,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!

原文鏈接:https://www.jianshu.com/p/c370d71432e0

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 深夜福利影院在线观看 | 黄色aaa级片| 色姑娘久 | 性伴交换多p | 欧美二区视频 | 北条麻妃黑人正在播放 | 国产精品久久久久久影院 | 大胆国模一区二区三区伊人 | 丝袜老师好湿好紧我要进去了 | 湖南美女被黑人4p到惨叫 | 亚洲精品私拍国产福利在线 | 五月丁香啪啪. | 欧美日韩一区二区三区韩大 | 调教老师肉色丝袜的故事 | 99精品视频一区在线观看miya | 免费福利资源站在线视频 | 日本亚洲欧洲高清有码在线播放 | 5g影院天天爽爽 | 99一区二区三区 | 日韩欧美成末人一区二区三区 | gayrb漫画免费入口 | 毛片免费观看 | 精新精新国产自在现 | 女女性恋爱视频入口 | 99在线精品视频 | 亚洲国产精久久久久久久 | chinses台湾男同志hd | 四虎在线视频免费观看视频 | 把内裤拔到一边高h1v1 | 日韩网站在线观看 | 18young第一次| 日韩精品亚洲一级在线观看 | 小早川怜子息梦精在线播放 | 禁忌第一季第3季 | 国产盗摄美女嘘嘘视频 | 色狠狠成人综合网 | 超h高h肉h文武侠 | 日本一道高清不卡免费 | 国产大片免费在线观看 | 色综合伊人色综合网亚洲欧洲 | 含羞草传媒每天免费一次破解 |