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