【SpringBoot】基于BeanDefinitionRegistryPostProcessor实现配置文件读取动态注入多个Bean

之前有写过一篇文章【设计模式】基于SpringBoot实现的策略模式 ,通过策略模式可以实现对于不同的参数,调用不同的bean,实现对于代码的最少侵入。基于这种方式,可以通过读取配置文件,注入到bean中,实现多个bean的配置方法。但是这种方式存在的问题就是:

  1. 配置文件每增加一个配置,需要增加一个bean配置类。
  2. 多个配置增加的时候容易遗漏,容易出错。

因此,本文将针对这种情况,基于BeanDefinitionRegistryPostProcessor实现配置文件读取动态注入多个Bean。

一、BeanDefinitionRegistryPostProcessor简介

BeanDefinitionRegistryPostProcessor即实现postProcessBeanDefinitionRegistry方法,可以修改增加BeanDefinition。

此特性可以用来动态生成bean,比如读取某个配置项,然后根据配置项动态生成bean。

spring中的容器其实就是 Beanfactory 中的一个 Map,key 是 Bean 的名称,value 是 Bean 对应的 BeanDefinition,这个注册 Bean 的方法由 BeanFactory 子类实现。

BeanDefinition 用于保存 Bean 的相关信息,包括属性、构造方法参数、依赖的 Bean 名称及是否单例、延迟加载等,它是实例化 Bean 的原材料,Spring 就是根据 BeanDefinition 中的信息实例化 Bean。

二、实现方式

首先是需要自定义实现类,实现BeanDefinitionRegistryPostProcessor以及EnvironmentAware。本文中还实现了ApplicationContextAware 接口,为的是重新获取已经注册的bean,如果没有这个需求是可以不实现的。

ApplicationContextAware 获取的对象是 ApplicationContext。 其继承了 Aware 接口,并定义一个 set 方法,参数就是 ApplicationContext 对象。 

1. 核心代码实现:

/**
* RestService根据配置自动注入Bean
*
* @author: xxx
* @date: 2020-09-11 9:28
* ApplicationContextAware 是为了重新获取bean而实现,不用可以不添加,后续会说明
*/
@Component
@Slf4j
public class RestServiceBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor, EnvironmentAware, ApplicationContextAware {


    privat
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在 MVC5 中使用 Autofac 实现配置文件注入,可以使用 Autofac Configuration 扩展,它可以从配置文件读取依赖项并将它们注册到容器中。 以下是实现配置文件注入的步骤: 1. 安装 Autofac.Configuration NuGet 包。 2. 创建一个名为 AutofacConfig 的类来注册依赖项。在 Register 方法中,使用 ConfigurationModule.Register 方法注册配置文件。 3. 在 Global.asax.cs 文件中的 Application_Start 方法中,调用 AutofacConfig 类的 Register 方法,并将其传递给一个新的 ContainerBuilder 对象。 4. 在 Global.asax.cs 文件中的 Application_EndRequest 方法中,调用 AutofacDependencyResolver 类的 Dispose 方法以清理依赖项。 下面是一个示例 AutofacConfig 类,用于在 MVC5 中实现配置文件注入: ```csharp using Autofac; using Autofac.Configuration; using System.Configuration; using System.Web.Mvc; public class AutofacConfig { public static void Register(ContainerBuilder builder) { var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); var module = new ConfigurationModule(config); builder.RegisterModule(module); builder.RegisterControllers(typeof(MvcApplication).Assembly); } } ``` 在 Global.asax.cs 文件中,可以像这样调用 AutofacConfig 类的 Register 方法: ```csharp protected void Application_Start() { var builder = new ContainerBuilder(); AutofacConfig.Register(builder); var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); // ... } ``` 然后,在 Global.asax.cs 文件中的 Application_EndRequest 方法中,可以像这样调用 AutofacDependencyResolver 类的 Dispose 方法: ```csharp protected void Application_EndRequest() { var resolver = DependencyResolver.Current as AutofacDependencyResolver; if (resolver != null) { resolver.Dispose(); } } ``` 现在,可以在 app.config 或 web.config 文件中定义依赖项。例如: ```xml <autofac> <components> <component type="MyService" service="IMyService"> <parameters> <parameter name="myDependency" type="MyDependency" /> </parameters> </component> <component type="MyDependency" service="IMyDependency" /> </components> </autofac> ``` 在这个例子中,MyService 类取决于 MyDependency 类。当容器构建时,Autofac 会读取配置文件注册 MyService 和 MyDependency 类。注意,service 属性指定了接口类型,而 type 属性指定了实现类型。 以上就是使用 Autofac 实现配置文件注入的步骤。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值