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

 

posted @ 2020-11-26 21:21  seeAll  阅读(1725)  评论(0编辑  收藏  举报