4,springboot自定義標簽bean(springext)


1,springboot項目啟動時,@SpringBootApplication自動裝配@Configuration,@Configuration里@ImportResource步驟2中創建的xml文件,

  並使用自定義的java類LoadCustomXmlBeanDefReader來加載xml文件中定義的bean:

@Configuration
@ImportResource(locations = {"classpath:transaction.xml"}, reader = LoadCustomXmlBeanDefReader.class)

 

2,創建2個bean定義xml文件 + LoadCustomXmlBeanDefReader

public class LoadCustomXmlBeanDefReader extends XmlBeanDefinitionReader

 

 

3,創建spring.schemas + spring.handlers + xsd文件

spring.schemas + spring.handlers要放在resources/META-INF下面

 

 4,解析自定義的bean標簽

public class TxBeanNamespaceHandler extends NamespaceHandlerSupport

public class TransactionBeanDefinitionParser extends AbstractSimpleBeanDefinitionParser

 

5,使用自定義的bean測試效果

 可以看出,一開始沒有李四這個用戶,之后我們插入李四這個用戶,再查詢,數據庫有了這個用戶,最后主動拋出異常,

可以看出事務回滾了,因為再查詢這個用戶的時候已經查不到了,說明這個自定義的帶有事務代理的bean有效了。

 

遇到的問題:

 1,xml里面無法注入通過注解(如@Bean、@Service等)注入的bean

應該不是同一個上下文導致的,注解的bean是啟動時被掃描注入的,我當時xml的bean是啟動后通過new ClassPathXmlApplicationContext("xml文件")得到的,

后來xml的bean我改成啟動時通過@ImportResource注入就好了,這兩種bean應該是屬於同一個上下文了。

 2,事務配置了readOnly,但是不生效,仍然能增刪改

應該是org.springframework.jdbc.datasource.DataSourceTransactionManager(使用mybatis) + oracle數據庫導致的,說這種組合下readOnly不是“一般意義上的”只讀,只是一種

提示,oracle只是會做優化,除非在自定義代碼里設置set(oracle只讀屬性)會有用;

而mysql不會出現這種情況,另外說org.springframework.jdbc.datasource.DataSourceTransactionManager(使用hibernate) + oracle數據庫也不會出現這種情況。

 3,spring.schemas文件配置的xsd文件找不到

我一開始把xsd文件放在java目錄下,用鼠標點配置文件,也能跳過去,但是不生效,改回resources目錄下就好了;其實放哪里都沒問題應該,只是我哪里配錯了;

還有spring.schemas、spring.handlers、xml、xsd都涉及到那個命名空間的地址一樣的配置,具體也不知道啥意思,都搞成一樣的,涉及xsd的加個.xsd。

 4,從已有的spring上下文取得已實例化的bean

public class AppBeanHolder implements ApplicationContextAware

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM