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