豆配置信息定义了Bean的实现及依赖关系,春容器根据各种形式的豆配置信息在容器内部建立豆定义注册表,然后根据注册表加载,实例化Bean,并建立Bean和Bean的依赖关系,最后将这些准备就绪的豆放到Bean缓存池中,以供外层的应用程序进行调用。
本文将给大家详细介绍关于在春天中使用编码方式动态配置Bean的相关内容,分享出来供大家参考学习、下面话不多说了,来一起看看详细的介绍吧。
DefaultListableBeanFactory实现了ConfigurableListableBeanFactory接口,可以通过这个类来动态注入Bean。为了保证注入的Bean也能被AOP增强,我们需要实现Bean的工厂后置处理器接口BeanFactoryPostProcessor。
需要动态注入的Bean:
公开课BookService { BookDao BookDao; 公共空间setBookDao (BookDao BookDao) { 这一点。bookDao=bookDao; } 公共BookDao getBookDao () { 返回bookDao; } }
实现Bean的工厂后置处理器接口:
@ component 公共类BookServiceFactoryBean实现BeanFactoryPostProcessor { 公共空间postProcessBeanFactory (ConfigurableListableBeanFactory beanFactory)抛出BeansException { beanFactory DefaultListableBeanFactory工厂=(DefaultListableBeanFactory);//豆定义 BeanDefinitionBuilder builder=BeanDefinitionBuilder.genericBeanDefinition (BookService.class);//设置属性 builder.addPropertyReference (“bookDao”、“bookDao”);//注册豆定义 factory.registerBeanDefinition (“bookService1 builder.getRawBeanDefinition ());//注册豆实例 工厂。registerSingleton (“bookService2”,新的net.deniro.spring4.dynamic.BookService ()); } }
这里假设bookDao已注入容器(XML或注解方式)。
在此,我们既可以注册Bean的定义,也可以直接注册Bean的实例。
配置:
& lt;上下文:component-scan基础包=" net.deniro.spring4.dynamic "/在
单元测试:
BookService bookService1=(BookService) context.getBean (“bookService1”); assertNotNull (bookService1); assertNotNull (bookService1.getBookDao ()); BookService bookService2=(BookService) context.getBean (“bookService2”); assertNotNull (bookService2);
为了更好地封装组件,增强组件的易用性,我们会将组件定义为标签。
自定义标签步骤为:
-
<李>采用XSD描述自定义标签的元素属性。李>
<李>编写豆定义的解析器。李>
<李>注册自定义标签的解析器。李>
<李>绑定命名空间解析器。李>
在资源中模式的文件夹下创建bookservice.xsd
& lt; & # 63; xml version=" 1.0 " encoding=" utf - 8 " & # 63;比; & lt; xsd:模式xmlns=" http://www.deniro.net/schema/service " xmlns: xsd=" http://www.w3.org/2001/XMLSchema " xmlns: bean=" http://www.springframework.org/schema/beans " targetNamespace=" http://www.deniro.net/schema/service " elementFormDefault="合格" attributeFormDefault="不合格" 比; & lt; !——导入bean命名空间——比; 导入命名空间& lt; xsd:=" http://www.springframework.org/schema/beans "/比; & lt; !——定义book服务标签——比; & lt; xsd: element name=" book服务"在 & lt; xsd: complexType> & lt; xsd: complexContent> & lt; xsd:扩展基?" bean: identifiedType”比; & lt; !——定义刀属性——比; & lt; xsd:属性名称="刀" type=" xsd: string "使用=皉equired”/比; & lt;/xsd: extension> & lt;/xsd: complexContent> & lt;/xsd: complexType> & lt;/xsd: element> & lt;/xsd: schema>
接着定义服务标签解析器:
公共类BookServiceDefinitionParser实现BeanDefinitionParser { 公共BeanDefinition解析(元素元素,ParserContext ParserContext) {//创建豆定义 BeanDefinitionBuilder builder=BeanDefinitionBuilder.genericBeanDefinition (BookService.class);//注入自定义的标签属性 字符串刀=element.getAttribute(“道”); builder.addPropertyReference (“bookDao”,刀);//注册豆定义 parserContext。registerBeanComponent(新BeanComponentDefinition(建设者 .getRawBeanDefinition (),“bookService”)); 返回null; } }如何在春天中使用编码方式动态配置Bean详解