`
weiqingfei
  • 浏览: 317451 次
  • 性别: Icon_minigender_1
  • 来自: 黑洞
社区版块
存档分类
最新评论

谈谈spring boot里的@import

    博客分类:
  • Java
 
阅读更多

使用spring boot时,如果想自己实现一些初始设置比较复杂的bean时,可以在类上用@Configuration注解,然后类内部在返回具体bean的方法上使用@Bean注解。

那么如何让容器找到这个配置类呢?

 

1.最简单的方法,当然是把它放到程序可以扫描到的package里,也就是@ComponentScan注解所指定的package里。

   平时自己创建的配置类通常用这种方法,简单明了。

 

2.如果没有在package扫描路径里,比如引入的第三方包,可以通过META-INF/spring.factories里用org.springframework.boot.autoconfigure.EnableAutoConfiguration来制定。

   spring-boot-autoconfigure包里的配置类都是通过这种方式引入的。

   当然,这个方式需要程序使用@EnableAutoConfiguration注解,这个注解是通过AutoConfigurationImportSelector来扫描spring.factories文件,把定义的配置类引入的。

 

3.使用@Import注解

   这个注解可以引入三种类

   a.使用了@Configuration注解的类

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

   b.ImportSelector的子类

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

       实际上上面2种所描述的AutoConfigurationImportSelector就是用的这种方式。

       另外一个比较典型的是注解@EnableTransactionManagement

       

@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 Ordered.LOWEST_PRECEDENCE;

}

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

     

public class TransactionManagementConfigurationSelector extends AdviceModeImportSelector<EnableTransactionManagement> {
	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的子类。

      这个其实跟注解@Configuration没啥关系了,因为是注解@Import的功能,所以就放在这儿一并说了。

      一般只要用户确切的知道哪些bean需要放入容器的话,自己便可以通过spring boot里所提供的注解来标识了,比如@Configuration里的@Bean,比如@Component,如果是spring mvc的话,还有一些专用的@Controller,@Service,@Repository。

      但是,如果是第三方包,而且又不是确定的类,并且这些类并不是spring专用,所以不想用spring的注解进行侵入式标识,那么如果找到这些类放到spring的容器呢?

      这时候就用到了用注解@Import引入ImportBeanDefinitionRegistrar子类的方式,最典型的应用就是mybatis,使用工具自动生成了一批mapper和entity,而如何把这些普通的类放入容器,就是通过注解@MapperScan

     

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

}

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

      代码就不贴了,有兴趣可以自行查看。

 

根据上面的描述,可以看出,如果不是制作模块,只是使用的话,通常用第一种就可以了,如果是制作第三方包,并且根据需求想更加灵活的把bean注册到容器的话,可以考虑其它方式。

 

上一篇文章Spring boot + doma2里所述doma-gen所生成的类没有办法自动注册,其实可以考虑实现ImportBeanDefinitionRegistrar的一个子类来解决这个问题。

分享到:
评论

相关推荐

    浅谈Spring中@Import注解的作用和使用

    Spring 中 @Import 注解的作用和使用 @Import 注解是 Spring 框架中的一种重要注解,主要用于导入@Configuration 注解的配置类、声明@Bean 注解的 bean 方法、导入 ImportSelector 的实现类或导入 ...

    如何使用Spring Boot的@Pointcut注解

    ### 如何使用Spring Boot的@Pointcut注解 #### 第一部分:@Pointcut注解简介 在Spring Boot中,@Pointcut注解是AspectJ框架的一部分,用于定义切点(Pointcut)。切点是在应用程序中定义的一组特定方法,当这些方法...

    详解Spring 注解之@Import 注入的各种花活

    Spring @Import 注解的多种使用场景 Spring 框架中的 @Import 注解是一个非常强大的工具,可以用来实现组件的自动装配和配置。下面我们将详细介绍 @Import 注解的多种使用场景,并通过示例代码来演示其使用方法。 ...

    Spring Boot利用@Async如何实现异步调用:自定义线程池

    Spring Boot利用@Async实现异步调用:自定义线程池 Spring Boot是一个流行的Java框架,它提供了许多实用的特性来简化应用程序的开发。其中,异步调用是Spring Boot中的一个重要特性,它允许开发者将一些耗时的任务...

    Spring boot——@DeclareParents例子

    在Spring Boot框架中,`@DeclareParents`注解是AOP(面向切面编程)的一部分,主要用于实现动态代理。AOP允许我们在不修改原有代码的情况下,通过“切面”来增强或修改程序的行为,这对于日志记录、事务管理等横切...

    spring boot资料以及项目

    Spring Boot是Java开发领域中的一款热门框架,它简化了基于Spring的应用程序的初始设置和配置。这个压缩包包含了丰富的Spring Boot学习资料以及实际项目案例,是深入理解和掌握Spring Boot技术的宝贵资源。 首先,...

    LEARNING SPRING BOOT 3.0 - THIRD EDITION

    《Learning Spring Boot 3.0 - 第三版》是一本专为Java和Spring开发者准备的指南,由Greg L. Turnquist撰写。这本书旨在简化生产级应用程序的开发过程,特别是利用Spring Boot 3.0框架。Spring Boot是Spring生态系统...

    十分钟上手spring boot

    ### 十分钟上手Spring Boot #### 快速上手Spring Boot项目及配置 ##### Spring Boot简介 Spring Boot 是一款基于 Spring 架构的全新框架,它极大地简化了基于 Spring 的应用开发。Spring Boot 旨在提供快速应用...

    Spring Boot实战派(源码)

    《Spring Boot实战派》源码提供了丰富的学习材料,旨在帮助开发者深入理解并熟练掌握Spring Boot这一流行的Java后端开发框架。Spring Boot简化了Spring应用程序的初始设置和配置,使得开发人员能够快速构建可运行的...

    Spring Boot整合Spring Batch,实现批处理

    在Java开发领域,Spring Boot和Spring Batch的整合是构建高效批处理系统的一种常见方式。Spring Boot以其简洁的配置和快速的启动能力深受开发者喜爱,而Spring Batch作为Spring框架的一部分,专注于批量处理任务,...

    Spring Boot系列四 Spring @Value 属性注入使用总结一

    Spring Boot系列四 Spring @Value 属性注入使用总结一

    Spring Boot 2 Recipes

    获取Spring Boot 2微框架的可重用代码配方和代码段 了解Spring Boot 2如何与其他Spring API,工具和框架集成 访问Spring MVC和新的Spring Web Sockets,以实现更简单的Web开发 使用微服务进行Web服务开发并与Spring ...

    Spring boot中@Conditional和spring boot的自动配置实例详解

    "Spring Boot 中 @Conditional 和 Spring Boot 的自动配置实例详解" Spring Boot 中的自动配置是指根据不同的情况来决定 Spring 配置应该用哪个,不应该用哪个。这种机制可以让开发者更方便地进行开发和配置。在 ...

    Spring-Boot-Reference-Guide, Spring Boot Reference Guide中文翻译 -《Spring Boot参考指南》.zip

    《Spring Boot参考指南》是Spring Boot开发者的重要参考资料,它详细阐述了Spring Boot框架的核心特性、配置方式、自动配置原理以及如何构建微服务应用等关键知识点。Spring Boot是Java开发领域中一个极其流行的轻量...

    最新Spring Boot Admin 官方参考指南-中文版-2.x

    Spring Boot Admin 是一个社区驱动的项目,用于监控和管理基于Spring Boot的应用程序。它通过HTTP接口或者Spring Cloud的服务注册中心(如Eureka、Consul)来注册和发现应用。Spring Boot Admin的用户界面是一个建立...

    Pro Spring Boot 2第2版-2009-EPUB版

    Pro Spring Boot 2: An Authoritative Guide to Building Microservices, Web and Enterprise Applications, and Best Practices Quickly and productively develop complex Spring applications and microservices...

    Spring boot 示例 官方 Demo

    spring-boot-helloWorld:spring-boot的helloWorld版本 spring-boot-mybaits-annotation:注解版本 spring-boot-mybaits-xml:xml配置版本 spring-boot-mybatis-mulidatasource:springboot+mybatis多数据源最简解决...

    Spring Boot揭秘 PDF

    《Spring Boot揭秘》这本书深入浅出地探讨了Spring Boot的核心概念和实现机制,为开发者提供了宝贵的实战指导。Spring Boot作为一款快速开发框架,简化了Java应用程序的初始设置和配置,使得开发者可以更专注于业务...

    Spring Boot 进阶笔记(详细全面) 中文PDF完整版.pdf

    Spring Boot 是一个由 Pivotal 团队开发的框架,旨在简化基于 Spring Framework 的应用程序的初始设置和开发过程。它的核心理念是“约定优于配置”,这意味着 Spring Boot 在默认情况下已经预设了很多常用的配置,...

Global site tag (gtag.js) - Google Analytics