這篇文章主要為大家展示了“如何解決基于spring同名bean覆蓋問題”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“如何解決基于spring同名bean覆蓋問題”這篇文章吧。
默認情況下,spring在處理同一個ApplicationContext中名稱相同的bean時
1、如果兩個bean是在同一個配置文件中,那么spring會報錯。
2、如果兩個bean是在不同的配置文件中,默認情況下,spring會覆蓋先前的bean。
在配置文件很多時,如果在啟動時,對于同名的bean加載沒有異常信息,出現問題后會比較難以定位。
在spring中,處理容器的元數據信息時,默認使用DefaultListableBeanFactory類,該類中有個屬性:allowBeanDefinitionOverriding,默認情況下為true,即允許重名的bean可以被覆蓋。
還好,spring有辦法對改屬性賦值。
重寫ContextLoaderListener,對于web應用,容器類型為XmlWebApplicationContext,在該類中設置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監聽器</description> <listener-class>com.***.trade.system.web.util.TradeContextLoaderListener</listener-class> </listener>
我們在設計程序框架的時候,會設計一個抽象基類,子類繼承這個基類,共有的方法放到基類中去,使用spring后使代碼變的很簡單,現在遇到的問題是在基類中注入bean后,子類不可能都會是有這個bean,那么需要考慮到子類需要覆蓋或者說重新注入個性化的bean
有三種方法來實現這個效果,以下是一種方法,如下面代碼:
public abstract class AbstractNameService
{
public abstract String getname();
}兩個實現類:
@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 >@Resource(name = "nameService")</span>
public void setService(AbstractNameService nameService)
{
this.nameService = nameService;
}
}實現類:
@Service("getNameService")
public class GetNameService extends AbstractService
{
<span >@Resource(name = "firstNameService")</span>
@Override
public void setService(AbstractNameService nameService)
{
this.nameService = nameService;
}
}@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/>標簽就行了
以上是“如何解決基于spring同名bean覆蓋問題”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。