专栏首页软件开发-青出于蓝Springboot中@Ehable**学习 原

Springboot中@Ehable**学习 原

    Springboot版本是1.5.release.

    Springboot中使用EnableAutoConfiguration注解,如下所示:

    List-1

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

	String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

	/**
	 * Exclude specific auto-configuration classes such that they will never be applied.
	 * @return the classes to exclude
	 */
	Class<?>[] exclude() default {};

	/**
	 * Exclude specific auto-configuration class names such that they will never be
	 * applied.
	 * @return the class names to exclude
	 * @since 1.3.0
	 */
	String[] excludeName() default {};

}

    主要是那个EnableAutoConfigurationImportSelector,继承了接口ImportSelector,方法String[] selectImports(AnnotationMetadata var1)返回的类都会注入到Sping容器中。

    我们来实现一个自己的ImportSelector。

                  图1

    如图1所示,我们定义自己的类SelectorA、SelectorB、SelectorC,定义MyImportSelector如下所示:

List-2

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

public class MyImportSelector implements ImportSelector {
    //会将这个方法返回的数组,放到容器中
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{"com.mjduan.project.springbootlearn.selector.SelectorA",
                "com.mjduan.project.springbootlearn.selector.SelectorB"};
    }
}

    之后定义自己的EnableMyX,如下List-3

List-3

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({MyImportSelector.class})
public @interface EnableMyX {
}

    在main方法的类上加上注解EnableMyX,如下所示:

List-4

import com.mjduan.project.springbootlearn.enable.EnableEcho;
import com.mjduan.project.springbootlearn.selector.EnableMyX;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableMyX
public class SpringbootLearnApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootLearnApplication.class, args);
    }
}

    我们通过BeanPostProcessor来验证SelectorA和SelectorB加入到容器中了,如下

List-5

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

@Component
public class MyImportSelectorBeanPostProcessor implements BeanPostProcessor {
    private String[] classess={
            "com.mjduan.project.springbootlearn.selector.SelectorA",
        "com.mjduan.project.springbootlearn.selector.SelectorB"};

    @Override
    public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
        return o;
    }

    @Override
    public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
        for (String str : classess) {
            if (o.getClass().getName().equals(str)) {
                System.out.println(o.getClass().getName());
            }
        }
        return o;
    }
}

    之后启动应用,在控制台就可以看到打印出的SelectorA和SelectorB了。

    ImportSelector返回的String[]会被注入到Spring容器中,EnableAutoConfiguration中EnableAutoConfigurationImportSelector返回的是META-INF/spring.factories中org.springframework.boot.autoconfigure.EnableAutoConfiguration的值,这些值都是些类名,这些类上都有@Configuration注解,这样就将这个配置类中的bean加入到容器中。

思考

  1. 问题1,ImportSelector返回的String[]是怎么加入到Spring容器中的,在Springboot启动流程中的哪个步骤呢?

Reference

  1. https://www.jianshu.com/p/3da069bd865c

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Springboot启动分析

        如下List-1所示是我们平时使用Springboot的方式,底层上发生了些什么呢,我们接下来分析下。

    克虏伯
  • Spring shell 的HelloWorld

    Spring官网看到SpringShell,自己最近探索了一下,写个简单的HelloWorld

    克虏伯
  • Springsecurity-oauth2之RemoteTokenServices

        RemoteTokenServices是用于向远程认证服务器验证token,同时获取token对应的用户的信息。

    克虏伯
  • springBoot @Enable*注解的工作原理

    run方法打印的内容是异步进行的,是独立于主线程外的线程,所以-----------end-----------打印后,run方法依然再进行打印

    HUC思梦
  • spring之order注解

    我们今天要分享的是spring框架提供的@Order注解的使用,估计这篇文章的阅读时间应该在二到三分钟之间就结束了。

    后端Coder
  • java实现短信验证码登陆 demo

    我们使用的API平台是:秒嘀云: https://sms.miaodiyun.com/login.html

    故久
  • MyBatis 源代码阅读笔记 2 基于"注解"方式的代码编写

    https://github.com/Jason-Chen-2017/source-code-reading

    一个会写诗的程序员
  • SpringBoot学习笔记(二) 文件访问映射

    Kindear
  • springboot任务之异步任务

    此时我们启动服务器,并输出localhost:8080/hello,会在3s之后响应的success。

    绝命生
  • String boot with Apache kafka 完整的发布订阅例子

    本文节选自电子书《Netkiller Java 手札》地址 http://www.netkiller.cn/ 5.21.7. 完整的发布订阅实例 上面的例子仅仅...

    netkiller old

扫码关注云+社区

领取腾讯云代金券