热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

如何在Spring中使用编码方式动态配置Bean详解

这篇文章主要给大家介绍了关于如何在Spring中使用编码方式动态配置Bean的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

bean与spring容器的关系

Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载、实例化Bean,并建立Bean和Bean的依赖关系,最后将这些准备就绪的Bean放到Bean缓存池中,以供外层的应用程序进行调用。

本文将给大家详细介绍关于在Spring中使用编码方式动态配置Bean的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

1 DefaultListableBeanFactory

DefaultListableBeanFactory 实现了 ConfigurableListableBeanFactory 接口,可以通过这个类来动态注入 Bean。为了保证注入的 Bean 也能被 AOP 增强,我们需要实现 Bean 的工厂后置处理器接口 BeanFactoryPostProcessor。

需要动态注入的 Bean:

public class BookService {
 BookDao bookDao;
 public void setBookDao(BookDao bookDao) {
 this.bookDao = bookDao;
 }

 public BookDao getBookDao() {
 return bookDao;
 }
}

实现 Bean 的工厂后置处理器接口:

@Component
public class BookServiceFactoryBean implements BeanFactoryPostProcessor {
 public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
 DefaultListableBeanFactory factory = (DefaultListableBeanFactory) beanFactory;

 //Bean 定义
 BeanDefinitionBuilder builder=BeanDefinitionBuilder.genericBeanDefinition
  (BookService.class);

 //设置属性
 builder.addPropertyReference("bookDao","bookDao");

 //注册 Bean 定义
 factory.registerBeanDefinition("bookService1",builder.getRawBeanDefinition());

 //注册 Bean 实例
 factory.registerSingleton("bookService2",new net.deniro.spring4.dynamic.BookService());
 }
}

这里假设 bookDao 已注入容器(XML 或 注解方式)。

在此,我们既可以注册 Bean 的定义,也可以直接注册 Bean 的实例。

配置:

单元测试:

BookService bookService1 = (BookService) context.getBean("bookService1");
assertNotNull(bookService1);
assertNotNull(bookService1.getBookDao());

BookService bookService2 = (BookService) context.getBean("bookService2");
assertNotNull(bookService2);

2 自定义标签

为了更好地封装组件,增强组件的易用性,我们会将组件定义为标签。

自定义标签步骤为:

  • 采用 XSD 描述自定义标签的元素属性。
  • 编写 Bean 定义的解析器。
  • 注册自定义标签的解析器。
  • 绑定命名空间解析器。

在 resources 中的 schema 文件夹下创建 bookservice.xsd

<&#63;xml version="1.0" encoding="UTF-8"&#63;>

 
 
 
 
  
   
    
     
     
    
   
  
 

接着定义服务标签解析器:

public class BookServiceDefinitionParser implements BeanDefinitionParser {
 public BeanDefinition parse(Element element, ParserContext parserContext) {
  //创建 Bean 定义
  BeanDefinitionBuilder builder=BeanDefinitionBuilder.genericBeanDefinition
    (BookService.class);

  //注入自定义的标签属性
  String dao=element.getAttribute("dao");
  builder.addPropertyReference("bookDao",dao);

  //注册 Bean 定义
  parserContext.registerBeanComponent(new BeanComponentDefinition(builder
    .getRawBeanDefinition(),"bookService"));
  return null;
 }
}

然后把刚刚定义好的解析器注册到命名空间:

public class BookServiceNamespaceHandler extends NamespaceHandlerSupport {
 public void init() {
  registerBeanDefinitionParser("book-service",new BookServiceDefinitionParser());
 }
}

接着在 resources 中创建 META-INF 文件夹,并新建 spring.schemas 与 spring.handlers,这两个文件分别用于配置自定义标签的文档结构文件路径以及解析自定义命名空间的解析器。

文件路径

spring.handlers:

http\://www.deniro.net/schema/service=net.deniro.spring4.dynamic.BookServiceNamespaceHandler

spring.schemas:

http\://www.deniro.net/schema/service.xsd=schema/bookservice.xsd

注意: xsd 文件必须放在 resources 的子孙目录下。

引用自定义标签:

<&#63;xml version="1.0" encoding="UTF-8"&#63;>

 
 

这里,我们在头部引用了自定义标签,并命名为 “me”,然后就可以使用它咯O(∩_∩)O~

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。


推荐阅读
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文探讨了在 ASP.NET MVC 5 中实现松耦合组件的方法。通过分离关注点,应用程序的各个组件可以更加独立且易于维护和测试。文中详细介绍了依赖项注入(DI)及其在实现松耦合中的作用。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 网易严选Java开发面试:MySQL索引深度解析
    本文详细记录了网易严选Java开发岗位的面试经验,特别针对MySQL索引相关的技术问题进行了深入探讨。通过本文,读者可以了解面试官常问的索引问题及其背后的原理。 ... [详细]
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • 科研单位信息系统中的DevOps实践与优化
    本文探讨了某科研单位通过引入云原生平台实现DevOps开发和运维一体化,显著提升了项目交付效率和产品质量。详细介绍了如何在实际项目中应用DevOps理念,解决了传统开发模式下的诸多痛点。 ... [详细]
  • 本文详细介绍了 RosPack 类的功能和用法,探讨了其在 ROS 系统中的重要作用。RosPack 类提供了类似于终端命令 rospack 的功能,能够方便地查询和管理 ROS 包的相关信息。 ... [详细]
  • 本文探讨了Java编程的核心要素,特别是其面向对象的特性,并详细介绍了Java虚拟机、类装载器体系结构、Java类文件和Java API等关键技术。这些技术使得Java成为一种功能强大且易于使用的编程语言。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 阿里云ecs怎么配置php环境,阿里云ecs配置选择 ... [详细]
author-avatar
郭伟健逍遥_308
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有