基于spring同名bean覆蓋問題的解決
spring同名bean覆蓋問題
默認(rèn)情況下,spring在處理同一個ApplicationContext中名稱相同的bean時
分為兩種情況處理
1、如果兩個bean是在同一個配置文件中,那么spring會報(bào)錯。
2、如果兩個bean是在不同的配置文件中,默認(rèn)情況下,spring會覆蓋先前的bean。
在配置文件很多時,如果在啟動時,對于同名的bean加載沒有異常信息,出現(xiàn)問題后會比較難以定位。
在spring中,處理容器的元數(shù)據(jù)信息時,默認(rèn)使用DefaultListableBeanFactory類,該類中有個屬性:allowBeanDefinitionOverriding,默認(rèn)情況下為true,即允許重名的bean可以被覆蓋。
還好,spring有辦法對改屬性賦值。
重寫ContextLoaderListener,對于web應(yīng)用,容器類型為XmlWebApplicationContext,在該類中設(shè)置allowBeanDefinitionOverriding為false,然后在spring啟動時,碰到同名bean就會拋出異常。
案例如下
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
我們在設(shè)計(jì)程序框架的時候,會設(shè)計(jì)一個抽象基類,子類繼承這個基類,共有的方法放到基類中去,使用spring后使代碼變的很簡單,現(xiàn)在遇到的問題是在基類中注入bean后,子類不可能都會是有這個bean,那么需要考慮到子類需要覆蓋或者說重新注入個性化的bean
有三種方法來實(shí)現(xiàn)這個效果,以下是一種方法,如下面代碼:
抽象基類
public abstract class AbstractNameService
{
public abstract String getname();
}
兩個實(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";
}
}
另外一個抽象基類
public abstract class AbstractService
{
protected AbstractNameService nameService;
public String getName()
{
return nameService.getname();
}
public AbstractNameService getService()
{
return nameService;
}
<span style="color:#ff9966;">@Resource(name = "nameService")</span>
public void setService(AbstractNameService nameService)
{
this.nameService = nameService;
}
}
實(shí)現(xiàn)類:
@Service("getNameService")
public class GetNameService extends AbstractService
{
<span style="color:#ff9900;">@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的配置文件只需要添加一個包<context:component-scan/>標(biāo)簽就行了
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot+Redisson自定義注解一次解決重復(fù)提交問題
項(xiàng)目中經(jīng)常會出現(xiàn)重復(fù)提交的問題,本文主要介紹了SpringBoot+Redisson自定義注解一次解決重復(fù)提交問題,具有一定的參考價值,感興趣的可以了解一下2024-03-03
Springboot集成RabbitMQ報(bào)錯及解決
這篇文章主要介紹了Springboot集成RabbitMQ報(bào)錯及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
Java開發(fā)者結(jié)合Node.js編程入門教程
這篇文章主要介紹了Java開發(fā)者結(jié)合Node.js編程入門教程,我將先向您展示如何使用Java EE創(chuàng)建一個簡單的Rest服務(wù)來讀取 MongoDB數(shù)據(jù)庫。然后我會用node.js來實(shí)現(xiàn)相同的功能,需要的朋友可以參考下2014-09-09
java實(shí)現(xiàn)Fibonacci算法實(shí)例
這篇文章主要介紹了java實(shí)現(xiàn)Fibonacci算法的方法,以實(shí)例形式較為詳細(xì)的分析了java實(shí)現(xiàn)Fibonacci算法的原理與相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-09-09
我從jdk1.8升級到j(luò)dk11所遇到的坑都有這些
這篇文章主要介紹了從jdk1.8升級到j(luò)dk11將會遇到的一些坑,本文給大家分享解決方案對大家的學(xué)習(xí)或工作具有參考借鑒價值,對jdk1.8升級到j(luò)dk11相關(guān)知識感興趣的朋友,快來看看吧2021-08-08
簡單實(shí)現(xiàn)java數(shù)獨(dú)游戲
這篇文章主要教大家如何簡單實(shí)現(xiàn)java數(shù)獨(dú)游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12
Spring Security學(xué)習(xí)之rememberMe自動登錄的實(shí)現(xiàn)
這篇文章主要給大家介紹了關(guān)于Spring Security學(xué)習(xí)之rememberMe自動登錄的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
在Mac下IDEA安裝并使用protobuf方式(Java)
這篇文章主要介紹了在Mac下IDEA安裝并使用protobuf方式(Java),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11

