基于spring同名bean覆盖问题的解决

目录
  • spring同名bean覆盖问题
    • 分为两种情况处理
    • 案例如下
  • spring 子类覆盖父类中注入的bean
    • 抽象基类
    • 另外一个抽象基类
    • controller

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

我们在设计程序框架的时候,会设计一个抽象基类,子类继承这个基类,共有的方法放到基类中去,使用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 style="color:#ff9966;">@Resource(name = "nameService")</span>
 public void setService(AbstractNameService nameService)
 {
  this.nameService = nameService;
 }
}

实现类:

@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/>标签就行了

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 简单了解Spring beanfactory循环依赖命名重复2大属性

    是否允许循环依赖和bean的命名重复取决于beanfactory的两大属性 allowBeanDefinitionOverriding和allowCircularReferences.这两个属性未指定时取的是DefaultListableBeanFactory中的默认值,均为true,即默认允许同名bean和循环引用(只有单例允许). 但是假如读者用的springboot版本比较新,就会发现情况并不是这样,同名bean会冲突报错.为什么呢,跟踪源码发现是Springboot应用在2.1.8版本的

  • 解决springboot中配置过滤器以及可能出现的问题

    在springboot添加过滤器有两种方式: 1.通过创建FilterRegistrationBean的方式(建议使用此种方式,统一管理,且通过注解的方式若不是本地调试,如果在filter中需要增加cookie可能会存在写不进前端情况) 2.通过注解@WebFilter的方式 通过创建FilterRegistrationBean的方式创建多个filter以及设置执行顺序: 1.创建两个实现Filter接口的类TestFilter1 .TestFilter2 package com.aoxun.c

  • 如何修改覆盖spring boot默认日志策略logback详解

    背景 Spring Boot在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持,如:Java Util Logging,Log4J, Log4J2和Logback.每种Logger都可以通过配置使用控制台或者文件输出日志内容. 默认日志Logback SLF4J--Simple Logging Facade For Java,它是一个针对于各类Java日志框架的统一Facade抽象.Java日志框架众多--常用的有java.util.logging, log

  • Spring实战之属性覆盖占位符配置器用法示例

    本文实例讲述了Spring实战之属性覆盖占位符配置器用法.分享给大家供大家参考,具体如下: 一 配置文件 <?xml version="1.0" encoding="GBK"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi

  • 基于spring同名bean覆盖问题的解决

    目录 spring同名bean覆盖问题 分为两种情况处理 案例如下 spring 子类覆盖父类中注入的bean 抽象基类 另外一个抽象基类 controller spring同名bean覆盖问题 默认情况下,spring在处理同一个ApplicationContext中名称相同的bean时 分为两种情况处理 1.如果两个bean是在同一个配置文件中,那么spring会报错. 2.如果两个bean是在不同的配置文件中,默认情况下,spring会覆盖先前的bean. 在配置文件很多时,如果在启动时,

  • 基于spring如何实现事件驱动实例代码

    干货点 通过阅读该篇博客,你可以了解了解java的反射机制.可以了解如何基于spring生命周期使用自定义注解解决日常研发问题.具体源码可以点击链接. 问题描述 在日常研发中,经常会遇见业务A的某个action被触发后,同时触发业务B的action的行为,这种单对单的形式可以直接在业务A的action执行结束后直接调用业务B的action,那么如果是单对多的情况呢? 方案解决 这里提供一种在日常研发中经常使用到的机制,基于spring实现的事件驱动,即在业务A的action执行完,抛出一个事件,

  • 基于Spring Web Jackson对RequestBody反序列化失败的解决

    最近在用Spring Web做一些Restful API的实现试验,碰到了@RequestBody 的JSON无法被正常反序列化的问题.服务端的代码大致如下: @RequestMapping(value = "/aquas", method = RequestMethod.POST) public Aqua createAqua(@RequestBody Aqua aqua) { return aqua; } 研究后发现,由于Aqua这个实体类缺少了默认的无参构造函数(如果自行添加了有

  • spring中bean id相同引发故障的分析与解决

    前言 最近因为同事bean配置的问题导致生产环境往错误的redis实例写入大量的数据,差点搞挂redis.经过快速的问题定位,发现是同事新增一个redis配置文件,并且配置的RedisSentinelConfiguration的id是一样的,然后在使用@Autowired注入bean的时候因为spring bean覆盖的机制导致读取的redis配置不是原来的. 总结起来,有两点问题: 为什么相同bean id的bean会被覆盖 @Autowired注解不是按照byType的方式进行注入的吗 代码

  • 基于spring boot 日志(logback)报错的解决方式

    记录一次报错解决方法: No converter found capable of converting from type [java.lang.String] to type [java.util.Map<java.lang.String, java.lang.String>] org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'logging.le

  • 基于Spring + Spring MVC + Mybatis 高性能web构建实例详解

    一直想写这篇文章,前段时间痴迷于JavaScript.NodeJs.AngularJS,做了大量的研究,对前后端交互有了更深层次的认识. 今天抽个时间写这篇文章,我有预感,这将是一篇很详细的文章,详细的配置,详细的注释,看起来应该很容易懂. 用最合适的技术去实现,并不断追求最佳实践.这就是架构之道. 希望这篇文章能给你们带来一些帮助,同时希望你们可以为这个项目贡献你的想法. 源码地址:https://github.com/Eliteams/quick4j 点击打开 源码地址:https://gi

  • 详解Spring中Bean的加载的方法

    之前写过bean的解析,这篇来讲讲bean的加载,加载要比bean的解析复杂些,从之前的例子开始. Spring中加载一个bean的方式: TestBean bean = factory.getBean("testBean"); 来看看getBean(String name)方法源码, @Override public Object getBean(String name) throws BeansException { return doGetBean(name, null, nul

  • 详解基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案

    分布式Web网站一般都会碰到集群session共享问题,之前也做过一些Spring3的项目,当时解决这个问题做过两种方案,一是利用nginx,session交给nginx控制,但是这个需要额外工作较多:还有一种是利用一些tomcat上的插件,修改tomcat配置文件,让tomcat自己去把Session放到Redis/Memcached/DB中去.这两种各有优缺,也都能解决问题. 但是现在项目全线Spring Boot,并不自己维护Tomcat,而是由Spring去启动Tomcat.这样就会有一

  • 基于Spring开发之自定义标签及其解析

    Spring框架是现在Java最流行的开源框架之一,并且Spring下的各种子项目对某些特定问题的解决有很好的支持.因此,如果能在Spring 基础上实现搭建自己的一套框架(基于XML配置).就必然需要实现一些自定义的标签,主要是方便使用我们框架的人能够快速.简单进行配置. 1. XML Schema 要想自定义标签,首先第一步需要写自己的XML Schema.XML Schema的个人感觉比较复杂,网上的教程比较简单,因此可以参照spring-beans.xsd依葫芦画瓢.这里就按照我自己的理

  • 基于Spring Security的Oauth2授权实现方法

    前言 经过一段时间的学习Oauth2,在网上也借鉴学习了一些大牛的经验,推荐在学习的过程中多看几遍阮一峰的<理解OAuth 2.0>,经过对Oauth2的多种方式的实现,个人推荐Spring Security和Oauth2的实现是相对优雅的,理由如下: 1.相对于直接实现Oauth2,减少了很多代码量,也就减少的查找问题的成本. 2.通过调整配置文件,灵活配置Oauth相关配置. 3.通过结合路由组件(如zuul),更好的实现微服务权限控制扩展. Oauth2概述 oauth2根据使用场景不同

随机推荐