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

  

  

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

  

豆配置信息定义了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详解