资讯专栏INFORMATION COLUMN

SpringBoot里的@Import使用

roland_reed / 1337人阅读

摘要:比较典型的是注解代码是通过类,根据注解所指定的来选择使用哪个配置类的。

前言

在日常利用SpringBoot开发的过程中,我们开发的Bean大部分都是依赖于spring容器进行管理,这样很方便日常Bean的注入。
大家都知道对象的创建必须通过构造方法创建,构造方法分为两种,一种时无参(此方法只是创建了个空对象,后续使用属性时还需要set/get),另外一种时重载的有参构造器(此方法创建后的对象,对于已经赋值的属性当然可以立马使用),所以Spring在创建Bean的时候也无非就这两种(默认时无参构造创建),基于spring体系的疮痈创建Bean注解有:比如@Configuration里的@Bean,比如@Component,如果是spring mvc的话,还有一些专用的@Controller,@Service,@Repository。

引入

那么,使用spring boot时,如果想自己实现一些初始设置比较复杂的bean时,可以在类上用@Configuration注解,然后类内部在返回具体bean的方法上使用@Bean注解。
那么,要让容器找到这个配置类,并让容器进行管理的话,方法有这么几种:

方法一:@ComponentScan注解

将配置类放到@ComponentScan注解所指定的package里。
以下是截取springboot Guide中的一段话:

方法二:使用@Import注解
首先,@Import是spring中的内置注解,所以spring会对此注解进行管理。
这个注解的主要用途截取spring的源码说明,然后逐一讲解:

a.允许使用@Configuration注解的类

这个比较简单,如果明确知道需要引入哪个配置类,直接引入就可以。

b.允许是实现ImportSelector接口的类

如果并不确定引入哪个配置类,需要根据@Import注解所标识的类或者另一个注解(通常是注解)里的定义信息选择配置类的话,用这种方式。
比较典型的是注解@EnableTransactionManagement

java代码:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({TransactionManagementConfigurationSelector.class})
public @interface EnableTransactionManagement {
    boolean proxyTargetClass() default false;
    AdviceMode mode() default AdviceMode.PROXY;
    int order() default 2147483647;
}
 

是通过TransactionManagementConfigurationSelector类,根据注解@EnableTransactionManagement所指定的AdviceMode来选择使用哪个配置类的。

 java代码:   
public class TransactionManagementConfigurationSelector extends AdviceModeImportSelector {

    @Override
    protected String[] selectImports(AdviceMode adviceMode) {
        switch (adviceMode) {
            case PROXY:
                return new String[] {AutoProxyRegistrar.class.getName(), ProxyTransactionManagementConfiguration.class.getName()};
            case ASPECTJ:
                return new String[] {TransactionManagementConfigUtils.TRANSACTION_ASPECT_CONFIGURATION_CLASS_NAME};
            default:
                return null;
        }
    }
}
c.允许是实现了ImportBeanDefinitionRegistrar接口的类

一般只要用户确切的知道哪些bean需要放入容器的话,自己便可以通过spring boot里所提供的注解来标识了,比如@Configuration里的@Bean,比如@Component,如果是spring mvc的话,还有一些专用的@Controller,@Service,@Repository。
但是,如果是第三方包,而且又不是确定的类,并且这些类并不是spring专用,所以不想用spring的注解进行侵入式标识,那么如果找到这些类放到spring的容器呢?
这时候就用到了用注解@Import引入ImportBeanDefinitionRegistrar子类的方式,最典型的应用就是mybatis,使用工具自动生成了一批mapper和entity,而如何把这些普通的类放入容器,就是通过注解

典型代表@MapperScan

java代码:

@Retention(RetentionPolicy.RUNTIME)  

@Target(ElementType.TYPE)
@Documented
@Import(MapperScannerRegistrar.class)
public @interface MapperScan {
String[] value() default {};
String[] basePackages() default {};
Class[] basePackageClasses() default {};
Class nameGenerator() default BeanNameGenerator.class;
Class annotationClass() default Annotation.class;
Class markerInterface() default Class.class;
String sqlSessionTemplateRef() default "";
String sqlSessionFactoryRef() default "";
Class factoryBean() default MapperFactoryBean.class;
}

这个注解用@Import引入了MapperScannerRegistrar类,这个类里会取得注解@MapperScan作设置的package,然后扫描这个package下所有的类,并放入容器中。

d.正如源码中的备注一样,"as well as regular component",说明,Import可以像类似于@Component此功能的注解一样,在容器启动的时候将此类定义为一个bean,并将此bean交于容器管理,但此用法较少。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69073.html

相关文章

  • springboot+ELK日志监控系统

    摘要:简介是简称是一个分布式的搜索和分析引擎,可以用于全文检索结构化检索和分析,并能将这三者结合起来。基于开发,现在是使用最广的开源搜索引擎之一。是一个开源的分析与可视化平台,设计出来用于和一起使用的。 ELK简介ELK是Elasticsearch+Logstash+Kibana简称 Elasticsearch 是一个分布式的搜索和分析引擎,可以用于全文检索、结构化检索和分析,并能将这三者结...

    gclove 评论0 收藏0
  • 最渣的 Spring Boot 文章

    摘要:如删除临时文件,清除缓存信息,读取配置文件信息,数据库连接等。提供的接口也可以满足该业务场景。不同点中方法的参数为,而接口中方法的参数为数组。 spring-boot-starter-parent Maven的用户可以通过继承spring-boot-starter-parent项目来获得一些合理的默认配置。这个parent提供了以下特性: 默认使用Java 8 使用UTF-8编码 一...

    yanest 评论0 收藏0
  • SpringBoot究竟是如何跑起来的?

    摘要:你可以试着沿着调用栈代码一层一层的深入进去,如果你不打断点,你根本不知道接下来程序会往哪里流动。接下来再看看运行时堆栈,看看一个请求的调用栈有多深。就是如此被自动装配进的。 摘要: 神奇的SpringBoot。 原文:SpringBoot 究竟是如何跑起来的? 作者:老钱 Fundebug经授权转载,版权归原作者所有。 不得不说 SpringBoot 太复杂了,我本来只想研究一下...

    DevWiki 评论0 收藏0
  • 一起来学SpringBoot | 第十三篇:RabbitMQ延迟队列

    摘要:另一种就是用中的位于包下,本质是由和实现的阻塞优先级队列。表明了一条消息可在队列中存活的最大时间。当某条消息被设置了或者当某条消息进入了设置了的队列时,这条消息会在时间后死亡成为。 SpringBoot 是为了简化 Spring 应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可...

    selfimpr 评论0 收藏0
  • Redis详解 - SpringBoot整合Redis,RedisTemplate和注解两种方式的使

    摘要:和注解的方法返回值要一致删除缓存在需要删除缓存的方法上加注解,执行完这个方法之后会将中对应的记录删除。代表返回值,意思是当返回码不等于时不缓存,也就是等于时才缓存。返回值特定值如果被设置了如果没有被设置例子自动将对应到并且返回原来对应的。 本文主要讲 Redis 的使用,如何与 SpringBoot 项目整合,如何使用注解方式和 RedisTemplate 方式实现缓存。最后会给一个用...

    SexySix 评论0 收藏0

发表评论

0条评论

roland_reed

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<