最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何在Spring中使用編碼方式動態(tài)配置Bean詳解

 更新時間:2018年05月16日 10:12:45   作者:deniro  
這篇文章主要給大家介紹了關于如何在Spring中使用編碼方式動態(tài)配置Bean的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

bean與spring容器的關系

Bean配置信息定義了Bean的實現(xiàn)及依賴關系,Spring容器根據(jù)各種形式的Bean配置信息在容器內部建立Bean定義注冊表,然后根據(jù)注冊表加載、實例化Bean,并建立Bean和Bean的依賴關系,最后將這些準備就緒的Bean放到Bean緩存池中,以供外層的應用程序進行調用。

本文將給大家詳細介紹關于在Spring中使用編碼方式動態(tài)配置Bean的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。

1 DefaultListableBeanFactory

DefaultListableBeanFactory 實現(xiàn)了 ConfigurableListableBeanFactory 接口,可以通過這個類來動態(tài)注入 Bean。為了保證注入的 Bean 也能被 AOP 增強,我們需要實現(xiàn) Bean 的工廠后置處理器接口 BeanFactoryPostProcessor。

需要動態(tài)注入的 Bean:

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

 public BookDao getBookDao() {
 return bookDao;
 }
}

實現(xiàn) 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 的實例。

配置:

<context:component-scan base-package="net.deniro.spring4.dynamic"
  />

單元測試:

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

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

2 自定義標簽

為了更好地封裝組件,增強組件的易用性,我們會將組件定義為標簽。

自定義標簽步驟為:

  • 采用 XSD 描述自定義標簽的元素屬性。
  • 編寫 Bean 定義的解析器。
  • 注冊自定義標簽的解析器。
  • 綁定命名空間解析器。

在 resources 中的 schema 文件夾下創(chuàng)建 bookservice.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://www.deniro.net/schema/service"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:beans="http://www.springframework.org/schema/beans"
   targetNamespace="http://www.deniro.net/schema/service"
   elementFormDefault="qualified"
   attributeFormDefault="unqualified"
  >
 <!-- 導入 beans 命名空間-->
 <xsd:import namespace="http://www.springframework.org/schema/beans"/>
 <!-- 定義 book-service 標簽-->
 <xsd:element name="book-service">
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="beans:identifiedType">
     <!-- 定義 dao 屬性-->
     <xsd:attribute name="dao" type="xsd:string" use="required"/>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>
</xsd:schema>

接著定義服務標簽解析器:

public class BookServiceDefinitionParser implements BeanDefinitionParser {
 public BeanDefinition parse(Element element, ParserContext parserContext) {
  //創(chuàng)建 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 中創(chuàng)建 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 的子孫目錄下。

引用自定義標簽:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:me="http://www.deniro.net/schema/service"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.deniro.net/schema/service http://www.deniro.net/schema/service.xsd
  ">
 <bean id="bookDao" class="net.deniro.spring4.dynamic.BookDao"/>
 <me:book-service dao="bookDao"/>
</beans>

這里,我們在頭部引用了自定義標簽,并命名為 “me”,然后就可以使用它咯O(∩_∩)O~

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • 通過Java測試幾種壓縮算法的性能(附測試代碼下載)

    通過Java測試幾種壓縮算法的性能(附測試代碼下載)

    這篇文章主要介紹了通過Java測試幾種壓縮算法的實際性能的一個實驗,包括Java自帶的deflate與GZIP壓縮方式,還是有一定借鑒意義的,需要的朋友可以參考下
    2015-12-12
  • Java 知識難點之異常的認知與使用詳解

    Java 知識難點之異常的認知與使用詳解

    所謂異常是指程序在運行時出現(xiàn)錯誤時提示調用者的機制,異常的種類有很多,不同種類的異常有不同的含義,也有不同的處理方式,通讀本篇對大家的學習或工作具有一定的價值,需要的朋友可以參考下
    2021-09-09
  • Java獲取字符串編碼格式實現(xiàn)思路

    Java獲取字符串編碼格式實現(xiàn)思路

    文件編碼的格式?jīng)Q定了文件可存儲的字符類型,所以得到文件的類型至關重要,下文筆者講述獲取一個文本文件的格式信息的方法分享及java字符串編碼格式實現(xiàn),感興趣的朋友一起看看吧
    2022-09-09
  • 如何通過java實現(xiàn)highcharts導出圖片至excel

    如何通過java實現(xiàn)highcharts導出圖片至excel

    這篇文章主要介紹了如何通過java實現(xiàn)highcharts導出圖片至excel。文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,下面我們就來一起學習一下吧
    2019-06-06
  • mybatis-plus中wrapper的用法實例詳解

    mybatis-plus中wrapper的用法實例詳解

    本文給大家介紹了mybatis-plus中wrapper的用法,包括條件構造器關系、項目實例及具體使用操作,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • 使用IDEA直接連接MySQL數(shù)據(jù)庫的方法

    使用IDEA直接連接MySQL數(shù)據(jù)庫的方法

    這篇文章主要介紹了如何使用IDEA直接連接MySQL數(shù)據(jù)庫,首先需要新建一個空項目,第一次連接 需要先下載驅動,文中給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • 通Java接口上傳實現(xiàn)SMMS圖床

    通Java接口上傳實現(xiàn)SMMS圖床

    這篇文章主要介紹了通Java接口上傳實現(xiàn)SMMS圖床,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • 詳解Java排序算法中的冒泡和選擇排序

    詳解Java排序算法中的冒泡和選擇排序

    這篇文章主要給大家介紹了Java排序算法中的冒泡排序和選擇排序,文中有詳細的圖文解釋和代碼示例,對我們學習Java算法有一定的幫助,感興趣的同學可以參考閱讀下
    2023-06-06
  • Java定時任務詳解

    Java定時任務詳解

    定時任務在項目中經(jīng)常會使用到,本文主要根據(jù)博主自己使用定時的經(jīng)驗分如下幾點介紹定時任務:1、Quartz定時任務簡介及Spring配置Quartz定時任務;2、SchedulerFactory對定時任務進行增刪改查
    2017-04-04
  • JVM教程之Java代碼編譯和執(zhí)行的整個過程(二)

    JVM教程之Java代碼編譯和執(zhí)行的整個過程(二)

    這篇文章主要介紹了JVM學習筆記第二篇,關于Java代碼編譯和執(zhí)行的整個過程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03

最新評論

宁国市| 五莲县| 霍林郭勒市| 金平| 南陵县| 民勤县| 济宁市| 伊吾县| 壶关县| 长治县| 凌源市| 河源市| 阜城县| 繁峙县| 新平| 岚皋县| 祁连县| 旅游| 科技| 尚志市| 平塘县| 云浮市| 南汇区| 科技| 黄冈市| 文安县| 南郑县| 确山县| 桦川县| 雷山县| 兴山县| 湟源县| 永安市| 大同县| 防城港市| 宁津县| 错那县| 华容县| 山丹县| 苏尼特右旗| 罗甸县|