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

Spring 父類變量注入失敗的解決

 更新時(shí)間:2021年09月22日 12:01:46   作者:長(zhǎng)風(fēng)2015  
這篇文章主要介紹了Spring 父類變量注入失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Spring 父類變量注入失敗

昨天遇到一個(gè)Action里面Service注入失敗,換種說法應(yīng)該說是根本沒有發(fā)生注入,本來很簡(jiǎn)單的一個(gè)問題,但由于在項(xiàng)目中多個(gè)Action進(jìn)行了繼承,才最終導(dǎo)致了這個(gè)看似奇怪的問題。

下面小記下這個(gè)過程

收到同事問題,“有個(gè)Action請(qǐng)求一直調(diào)用報(bào)控指針,service一直是空的導(dǎo)致的!”

初步看了代碼及配置,沒有發(fā)現(xiàn)什么問題,起初懷疑是Action沒有g(shù)et方法所致,然后加上仍然無效;然后單步做了各種變量名的替換,一直一樣問題 ,這過程中一直關(guān)注java代碼確忽略了頁面請(qǐng)求,通過頁面請(qǐng)求發(fā)現(xiàn)代碼真正邏輯是頁面請(qǐng)求了一個(gè)子類Action的方法,而這個(gè)方法里面調(diào)用了父類的一個(gè)方法,此時(shí)父類里面的Service一直無法注入,對(duì)于上面所提的這種需求,實(shí)際上是需要在子類做Spring注入的同時(shí)也進(jìn)行父類的Spring注入,那么這種需要這樣的配置:

<bean id="****Action" class="com.**.**.contrl.**.mgr.action.**Action" scope="prototype" parent="termCommonAction">
  <property name="orderVerifyApiFacade" ref="ord.bizprov.orderVerifyApiFacade"/>
  <property name="orderListQryApiFacade" ref="ord.query.orderListQryApiFacade"/>
  <property name="channelQryApiFacade" ref="cfguse.channel.channelQryApiFacade" />
</bean> 

經(jīng)過上面的設(shè)置以后,請(qǐng)求子類的Action方法,子類方法中調(diào)用父類方法時(shí),就不會(huì)出現(xiàn)父類不發(fā)生注入的問題了。

Spring通過父類注入公用屬性的技巧

XML配置方式提取父類

在使用Spring + Hibernate框架,或者SSH2等框架的時(shí)候,在開發(fā)中只有一個(gè)基本的DAO是現(xiàn)在的非常流行的做法。然后,在看過多份這種代碼以后,都是在每個(gè)業(yè)務(wù)類中聲明了一個(gè)DAO屬性,并且在Bean配置中,對(duì)每個(gè)業(yè)務(wù)類分別注入DAO。具體情形示例如下:

BaseDAO代碼:

public class BaseDAO {
 public String service() {
  return "Success!";
 }
}

Services代碼:

//第一個(gè)業(yè)務(wù)類
public class ServiceA {
 public String service() {
  return baseDAO.service();
 } 
 protected BaseDAO baseDAO; 
 public void setBaseDAO(BaseDAO baseDAO) {
  this.baseDAO = baseDAO;
 }
}
 
//第二個(gè)業(yè)務(wù)類
public class ServiceB {
 public String service() {
  return baseDAO.service();
 }
 
 protected BaseDAO baseDAO; 
 public void setBaseDAO(BaseDAO baseDAO) {
  this.baseDAO = baseDAO;
 }
}

Spring的Bean配置如下:

<bean id="baseDAO" class="com.watson.BaseDAO" />
<bean id="serviceA" class="com.watson.ServiceA">
 <property name="baseDAO" ref="baseDAO" />
</bean>
<bean id="serviceB" class="com.watson.ServiceB">
 <property name="baseDAO" ref="baseDAO" />
</bean>

這樣的做法是現(xiàn)在的主流。這樣做不是說那里錯(cuò)了,還是那句老話:這樣做肯定不優(yōu)美,誰讓人有時(shí)候是一根筋呢?

能夠想到的辦法是用一個(gè)父類來包含一些業(yè)務(wù)層公用的業(yè)務(wù)邏輯和屬性。所以可以將上面的代碼和配置。

Services代碼改寫如下:

//所有業(yè)務(wù)類的父類
public class BaseService {
 protected BaseDAO baseDAO; 
 public void setBaseDAO(BaseDAO baseDAO) {
  this.baseDAO = baseDAO;
 }
}
//第一個(gè)業(yè)務(wù)類
public class ServiceA extends BaseService  {
 public String service() {
  return baseDAO.service();
 }
}
//第二個(gè)業(yè)務(wù)類
public class ServiceB extends BaseService  {
 public String service() {
  return baseDAO.service();
 }
}

Spring的Bean配置改寫如下:

<bean id="baseDAO" class="com.watson.BaseDAO" />
<bean id="BaseService" class="com.watson.BaseService" />
 <property name="baseDAO" ref="baseDAO" />
</bean>
<bean id="serviceA" class="com.watson.ServiceA" />
<bean id="serviceB" class="com.watson.ServiceB" />

這樣一來是不簡(jiǎn)潔了很多?尤其在實(shí)際項(xiàng)目有太多Bean的時(shí)候。然后,這里不會(huì)達(dá)到我們預(yù)想的結(jié)果,因?yàn)檫@里會(huì)出現(xiàn)如下的錯(cuò)誤:

exception:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is

java.lang.NullPointerException

......

root cause:

java.lang.NullPointerException:......

而出錯(cuò)代碼就是每個(gè)業(yè)務(wù)中調(diào)用baseDAO的那行代碼。這說明注入失敗了。翻閱Spring的Bean注入詳解之后,很快就可以找應(yīng)該設(shè)置子類Bean配置的parent屬性。所以這里可以修改設(shè)置。

Spring的Bean配置改寫如下:

<bean id="baseDAO" class="com.watson.BaseDAO" />
<bean id="BaseService" class="com.watson.BaseService" />
 <property name="baseDAO" ref="baseDAO" />
</bean>
<bean id="serviceA" class="com.watson.ServiceA" parent="baseService" />
<bean id="serviceB" class="com.watson.ServiceB" parent="baseService" />

這個(gè)時(shí)候再運(yùn)行,就不會(huì)報(bào)錯(cuò)了。原理是:在Spring的子類Bean配置中,其parent屬性作用是指定其父類,并繼承父類的注入屬性。不僅如此,子類還可以修改或者覆蓋父類的屬性值。例如上述代碼中的子類修改父類的baseDAO到屬性:

<bean id="BaseService" class="com.watson.BaseService" />
 <property name="baseDAO" ref="baseDAO" />
</bean>
<bean id="serviceA" class="com.watson.ServiceA" parent="baseService" />
<property name="baseDAO" ref="baseDAO2" />
</bean>

而對(duì)于父類的List等集合屬性,子類可以繼承父類的值,并且在其基礎(chǔ)上進(jìn)行增加新的值:

<bean id="BaseService" class="com.watson.BaseService" />
 <property name="listValue">  
  <list>  
   <value>listValue1</value>  
   <value>listValue2</value>  
  </list>  
 </property> 
</bean>
<bean id="serviceA" class="com.watson.ServiceA" parent="baseService" />
 <property name="listValue">  
  <list>  
   <value>listValue3</value>  
   <value>listValue4</value>  
  </list>  
 </property> 
</bean>

Annotation方式提取父類

上面的方法是在XML配置文件中進(jìn)行的配置。而對(duì)現(xiàn)在Spring3流行的Annotation方式,其實(shí)更加的方便,完整示例如下:

BaseDAO代碼:

@Component
public class BaseDAO {
 public String service() {
  return "Success!";
 }
}

Services代碼:

//所有業(yè)務(wù)類的父類
public class BaseService {
 @Autowired
 protected BaseDAO baseDAO;
}
 
//第一個(gè)業(yè)務(wù)類
@Component
public class ServiceA extends BaseService  {
 public String service() {
  return baseDAO.service();
 }
}
//第二個(gè)業(yè)務(wù)類
@Component
public class ServiceB extends BaseService  {
 public String service() {
  return baseDAO.service();
 }
}

Action層代碼:

@Controller
@RequestMapping(value = "/testaction")
public class TestAction {
 @Autowired
 private ServiceA service;
 
 @RequestMapping(value = "/")
 public @ResponseBody String home(Model model) {
  return service.service();
 }
}

這里根本就不需要進(jìn)行parent屬性子類的配置,可以完美的提取父類,并且可以順利的使用父類的公用屬性。至于原理,沒有去看源碼的處理方式,估計(jì)和上述XML配置是異曲同工的,只是在這里增加了對(duì)父類的檢測(cè)。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringCloud對(duì)服務(wù)內(nèi)某個(gè)client進(jìn)行單獨(dú)配置的操作步驟

    SpringCloud對(duì)服務(wù)內(nèi)某個(gè)client進(jìn)行單獨(dú)配置的操作步驟

    我們的微服務(wù)項(xiàng)目用的是springCloud,某個(gè)微服務(wù)接口因?yàn)閿?shù)據(jù)處理量大,出現(xiàn)了接口超時(shí)的情況,我們需要單獨(dú)修改這一個(gè)feignClient的超時(shí)時(shí)間,所以本文介紹了SpringCloud對(duì)服務(wù)內(nèi)某個(gè)client進(jìn)行單獨(dú)配置的操作步驟,需要的朋友可以參考下
    2023-10-10
  • Java編譯時(shí)類型與運(yùn)行時(shí)類型

    Java編譯時(shí)類型與運(yùn)行時(shí)類型

    這篇文章主要介紹了Java編譯時(shí)類型與運(yùn)行時(shí)類型,文章以父類BaseClass和子類SubClass為例展開對(duì)主題的探討,具有一的?參考價(jià)值,需要的小伙伴可以參考一下
    2022-03-03
  • Java實(shí)現(xiàn)按行分割大文件

    Java實(shí)現(xiàn)按行分割大文件

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)按行分割大文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Async的線程池使用選擇解析

    Async的線程池使用選擇解析

    這篇文章主要為大家介紹了Async的線程池使用選擇解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Java如何處理圖片保存之后變紅色的問題

    Java如何處理圖片保存之后變紅色的問題

    這篇文章主要介紹了Java如何處理圖片保存之后變紅色的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java異常中toString()和getMessage()區(qū)別

    Java異常中toString()和getMessage()區(qū)別

    在java異常體系中,要打印異常信息,可以通過:e.getMessage() 、 e.toString() e.printStackTrace() 等方法打印,本文主要介紹了Java異常中toString()和getMessage()區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Java圖論進(jìn)階之最小生成樹算法詳解

    Java圖論進(jìn)階之最小生成樹算法詳解

    最小生成樹(Minimum Spanning Tree)就是給定無向圖中,邊權(quán)重最小的生成樹,下面這篇文章主要給大家介紹了關(guān)于Java圖論進(jìn)階之最小生成樹算法的相關(guān)資料,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • SSH框架網(wǎng)上商城項(xiàng)目第5戰(zhàn)之商品類別級(jí)聯(lián)查詢和分頁功能

    SSH框架網(wǎng)上商城項(xiàng)目第5戰(zhàn)之商品類別級(jí)聯(lián)查詢和分頁功能

    SSH框架網(wǎng)上商城項(xiàng)目第5戰(zhàn)之商品類別級(jí)聯(lián)查詢和分頁功能,寫一下CategoryServiceImpl實(shí)現(xiàn)類,完成數(shù)據(jù)庫的級(jí)聯(lián)查詢,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Java使用SLF4J記錄不同級(jí)別日志的示例詳解

    Java使用SLF4J記錄不同級(jí)別日志的示例詳解

    SLF4J是一個(gè)簡(jiǎn)單的日志門面,它允許在運(yùn)行時(shí)選擇不同的日志實(shí)現(xiàn),這篇文章主要為大家詳細(xì)介紹了如何使用SLF4J記錄不同級(jí)別日志,感興趣的可以了解下
    2025-04-04
  • SpringBoot全局異常處理與定制404頁面的方法

    SpringBoot全局異常處理與定制404頁面的方法

    這篇文章主要介紹了SpringBoot全局異常處理與定制404頁面的相關(guān)資料,本文通過實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2007-09-09

最新評(píng)論

延安市| 礼泉县| 奉新县| 定安县| 新巴尔虎左旗| 上饶县| 梅河口市| 高清| 宜都市| 兰州市| 景东| 鄯善县| 汶川县| 汉阴县| 阳东县| 漾濞| 临夏县| 汝州市| 二连浩特市| 丰都县| 达拉特旗| 封丘县| 西丰县| 卓资县| 堆龙德庆县| 朔州市| 读书| 饶河县| 宣武区| 上杭县| 阳高县| 洪湖市| 桃园市| 博野县| 福州市| 富宁县| 英吉沙县| 虞城县| 陇川县| 澎湖县| 日喀则市|