溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何解決基于spring同名bean覆蓋問題

發(fā)布時(shí)間:2021-09-24 11:27:53 來源:億速云 閱讀:422 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要為大家展示了“如何解決基于spring同名bean覆蓋問題”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何解決基于spring同名bean覆蓋問題”這篇文章吧。

spring同名bean覆蓋問題

默認(rèn)情況下,spring在處理同一個(gè)ApplicationContext中名稱相同的bean時(shí)

分為兩種情況處理

1、如果兩個(gè)bean是在同一個(gè)配置文件中,那么spring會(huì)報(bào)錯(cuò)。

2、如果兩個(gè)bean是在不同的配置文件中,默認(rèn)情況下,spring會(huì)覆蓋先前的bean。

在配置文件很多時(shí),如果在啟動(dòng)時(shí),對(duì)于同名的bean加載沒有異常信息,出現(xiàn)問題后會(huì)比較難以定位。

在spring中,處理容器的元數(shù)據(jù)信息時(shí),默認(rèn)使用DefaultListableBeanFactory類,該類中有個(gè)屬性:allowBeanDefinitionOverriding,默認(rèn)情況下為true,即允許重名的bean可以被覆蓋。

還好,spring有辦法對(duì)改屬性賦值。

重寫ContextLoaderListener,對(duì)于web應(yīng)用,容器類型為XmlWebApplicationContext,在該類中設(shè)置allowBeanDefinitionOverriding為false,然后在spring啟動(dòng)時(shí),碰到同名bean就會(huì)拋出異常。

案例如下

public class TradeContextLoaderListener extends ContextLoaderListener {
 @Override
 protected void customizeContext(ServletContext servletContext,
   ConfigurableWebApplicationContext applicationContext) {
  super.customizeContext(servletContext, applicationContext);
  XmlWebApplicationContext context = (XmlWebApplicationContext) applicationContext;
  context.setAllowBeanDefinitionOverriding(false);
 }
}

配置web.xml:

 <listener>
  <description>spring監(jiān)聽器</description>
  <listener-class>com.***.trade.system.web.util.TradeContextLoaderListener</listener-class>
 </listener>

spring 子類覆蓋父類中注入的bean

我們?cè)谠O(shè)計(jì)程序框架的時(shí)候,會(huì)設(shè)計(jì)一個(gè)抽象基類,子類繼承這個(gè)基類,共有的方法放到基類中去,使用spring后使代碼變的很簡單,現(xiàn)在遇到的問題是在基類中注入bean后,子類不可能都會(huì)是有這個(gè)bean,那么需要考慮到子類需要覆蓋或者說重新注入個(gè)性化的bean

有三種方法來實(shí)現(xiàn)這個(gè)效果,以下是一種方法,如下面代碼:

抽象基類

public abstract class AbstractNameService
{
 public abstract String getname();
}

兩個(gè)實(shí)現(xiàn)類:

@Service("firstNameService")
public class FirstNameService extends AbstractNameService
{ 
 @Override
 public String getname()
 {
  return "FirstName";
 } 
}
@Service("nameService")
public class NameService extends AbstractNameService
{ 
 @Override
 public String getname()
 {
  return "Name";
 } 
}

另外一個(gè)抽象基類

public abstract class AbstractService
{
 protected AbstractNameService nameService; 
 public String getName()
 {
  return nameService.getname();
 } 
 public AbstractNameService getService()
 {
  return nameService;
 } 
 <span >@Resource(name = "nameService")</span>
 public void setService(AbstractNameService nameService)
 {
  this.nameService = nameService;
 } 
}

實(shí)現(xiàn)類:

@Service("getNameService")
public class GetNameService extends AbstractService
{ 
 <span >@Resource(name = "firstNameService")</span>
 @Override
 public void setService(AbstractNameService nameService)
 {
  this.nameService = nameService;
 } 
}

controller

@Controller
public class UnionpayQuickPayDSMVC
{
 @Resource
 private AbstractService getNameService; 
 @RequestMapping(value = "/*", method = RequestMethod.GET)
 public void execute(HttpServletRequest request, HttpServletResponse response)
 {
  try
  {
   response.getWriter().write(getNameService.getName());
  }
  catch (IOException e)
  {
   System.out.println(e);
  }
 }
}

在applicationContext.xml和springmvc的配置文件只需要添加一個(gè)包<context:component-scan/>標(biāo)簽就行了

以上是“如何解決基于spring同名bean覆蓋問題”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI