@MapperScan annotationClass属性自定义注解不生效的原因分析

先上结论:自定义的注解没加元注解@Retention,默认的是CLASS运行时通过反射是拿不到的,设置为runtime就解决了。

mybatis自动生成接口实现的扫描注解@MapperScan可以自定义自己的注解,这样的话就可以在多数据源情境下来区分扫描不同的包了,这里不介绍细节仅仅贴下代码实例。

@Configuration
@MapperScan(basePackages = "xxx.dao",sqlSessionFactoryRef = "oneSqlSessionFactory",annotationClass = OneMapper.class)
public class OneDataSourceConfig {

    @Value("${mybatis.config-location}")
    private String configLocation;

    @Bean(initMethod = "init",destroyMethod = "close")
    @ConfigurationProperties("spring.datasource.druid.one")
    public DruidDataSource oneDataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        return dataSource;
    }

    @Bean
    public DataSourceTransactionManager oneTransactionManager() {
        return new DataSourceTransactionManager(oneDataSource());
    }

    @Bean
    public SqlSessionFactory oneSqlSessionFactory(@Qualifier("oneDataSource") DataSource oneDataSource,ApplicationContext ctx)
            throws Exception {
        String[] typeAliasesPackages = new String[]{
        };
        final SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
        factory.setConfigLocation(ctx.getResource(configLocation));
        factory.setVfs(SpringBootVFS.class);
        factory.setDataSource(oneDataSource);
        factory.setTypeAliasesPackage(StringUtils.join(typeAliasesPackages,","));
        factory.setMapperLocations(ctx.getResources("classpath:mybatis/**/*One.xml"));
        return factory.getObject();
    }
}

@Configuration
@MapperScan(basePackages = "xxx.dao",sqlSessionFactoryRef = "sqlSessionFactory",annotationClass = Mapper.class)
public class DataSourceConfig {

    @Value("${mybatis.config-location}")
    private String configLocation;

    @Primary
    @Bean(initMethod = "init",destroyMethod = "close")
    @ConfigurationProperties("spring.datasource.druid.main")
    public DruidDataSource dataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        return dataSource;
    }

    @Bean
    @Primary
    public DataSourceTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }

    @Bean
    @Primary
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource, ApplicationContext ctx)
            throws Exception {
        String[] typeAliasesPackages = new String[]{
        };
        final SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
        factory.setConfigLocation(ctx.getResource(configLocation));
        factory.setVfs(SpringBootVFS.class);
        factory.setDataSource(dataSource);
        factory.setTypeAliasesPackage(StringUtils.join(typeAliasesPackages,","));
        factory.setMapperLocations(ctx.getResources("classpath:mybatis/**/*Mapper.xml"));
        return factory.getObject();
    }
}

开始的时候总是第二个数据源不能自动注入bean成功,报@Autowired的依赖错误,发现代码没什么问题,网上也没找到什么答案,没办法找到源码debug一点点看,发现获取类信息的时候用我自定义的注解的类没拿到信息,再回去看注解,发现什么元注解都没加,而引起原因的就是@Retention注解,默认的是CLASS运行时通过反射是拿不到的。
ddjfjjdjfsjf
@MapperScan主要的注入逻辑都在MapperScannerConfigurer类中

@Retention注解
Reteniton的作用是定义被它所注解的注解保留多久,一共有三种策略,定义在RetentionPolicy枚举中

public enum RetentionPolicy {
    SOURCE,
    CLASS,
    RUNTIME
}

1.SOURCE
被编译器忽略

2.CLASS
注解将会被保留在Class文件中,但在运行时并不会被VM保留。这是默认行为,所有没有用Retention注解的注解,都会采用这种策略。

3.RUNTIME
保留至运行时。所以我们可以通过反射去获取注解信息。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值