Spring boot自动配置

翻译 2018年04月15日 17:59:38

1、从源码角度看spring boot 自动配置

SpringApplication application = new SpringApplication(HelloApplication.class);

这个方法调用的是

public SpringApplication(Object... sources) {
        initialize(sources);
}

@SuppressWarnings({ "unchecked", "rawtypes" })
private void initialize(Object[] sources) {
        if (sources != null && sources.length > 0) {
            this.sources.addAll(Arrays.asList(sources));
        }
        this.webEnvironment = deduceWebEnvironment();
        setInitializers((Collection) getSpringFactoriesInstances(
                ApplicationContextInitializer.class));
        setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
        this.mainApplicationClass = deduceMainApplicationClass();
}

getSpringFactoriesInstances方法最终最重要的调用是:

public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
        String factoryClassName = factoryClass.getName();
        try {
            Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
                    ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
            List<String> result = new ArrayList<String>();
            while (urls.hasMoreElements()) {
                URL url = urls.nextElement();
                Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
                String factoryClassNames = properties.getProperty(factoryClassName);
                result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
            }
            return result;
        }
        catch (IOException ex) {
            throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +
                    "] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);
        }
    }

而 FACTORIES_RESOURCE_LOCATION=META-INF/spring.factories
这个其实就是一些自动配置类,如果满足条件就创建配置类,加载配置。这个其实就是spring boot根据jar包自动配置的原理。

2、模拟自动配置

2.1属性类

package cn.itcast.springboot.demo.auto;

import org.springframework.stereotype.Component;

/**
 * 创建真正的bean需要的属性类
 * 2018年4月15日
 *
 */
@Component
public class HelloProperties {

  private String msg="default";//现在我们在配置文件写hello.msg=world,因为简单就不再展示;如果那么默认为default.

  public String getMsg() {
      return msg;
  }

  public void setMsg(String msg) {
      this.msg = msg;
  }
}

2.2 spring需要管理的bean

package cn.itcast.springboot.demo.auto;


public class HelloService {

    private String msg = "service";//如果自动配置没有读入成功,那么为默认值

    public String say() {
        return "hello " + msg;
    }//为我们服务的方法

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

2.4 模拟spring boot的自动配置类
它主要负责把HelloProperties 的属性注入到HelloService 中去

package cn.itcast.springboot.demo.auto;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration //配置类
@ConditionalOnClass(HelloService.class)//当类路径存在这个类时才会加载这个配置类
public class HelloAutoConfiguration {

    @Autowired
    private HelloProperties helloProperties;

    @Bean
    @ConditionalOnMissingBean(HelloService.class)//如果没有我们的自定义Bean那么才会自动配置一个新的Bean
    public HelloService auto(){
        HelloService helloService =new HelloService();
        helloService.setMsg(helloProperties.getMsg());
        return helloService;
    }

}

通过上面三步在spring容器中就创建了 HelloService ,并且把属性都自动配置好了

[Spring Boot] 3. Spring Boot实现自动配置的基础

在第一篇文章介绍Spring Boot启动过程,提到了Spring Boot的核心能力 - 自动配置。这个能力也是Spring Boot非常大的卖点之一。对这个能力,相信很多同学都会比较好奇,Spri...
  • dm_vincent
  • dm_vincent
  • 2017-08-20 23:00:20
  • 1397

Spring Boot自动配置实例

spring boot之所以能够自动配置bean,是通过基于条件来配置Bean的能力实现的。 常用的条件注解如下 @ConditionalOnBean:当容器里存在指定的Bean的条件下 @C...
  • weixin_34783968
  • weixin_34783968
  • 2016-12-20 10:33:18
  • 610

spring boot自动配置

随着Ruby、Groovy等动态语言的流行,相比较之下Java的开发显得格外笨重。繁多的配置、低下的开发效率、复杂的部署流程以及第三方技术集成难度大等问题一直被人们所诟病。随着Spring家族中的新星...
  • u010708759
  • u010708759
  • 2017-09-06 11:17:14
  • 440

初识Spring Boot框架(二)之DIY一个Spring Boot的自动配置

在上篇博客初识Spring Boot框架中我们初步见识了SpringBoot的方便之处,很多小伙伴可能也会好奇这个Spring Boot是怎么实现自动配置的,那么今天我就带小伙伴我们自己来实现一个简单...
  • u012702547
  • u012702547
  • 2016-12-20 14:47:30
  • 25260

Spring Boot自动化配置的利弊及解决之道

Spring Boot中的双刃剑:自动化配置 在之前发布的Spring Boot基础教程系列文章中,我们通过各种功能性示例体验了Spring Boot的自动化配置给我们所带来的超便利的新开发方式。但是...
  • dyc87112
  • dyc87112
  • 2017-06-26 14:11:33
  • 2071

5Spring Boot集成Redis实现自动配置

spring Boot官方提供了Spring-Data-Redis的Starter POM 有兴趣的可以查看下这篇资料 http://blog.didispace.com/spring...
  • xiaoliuliu2050
  • xiaoliuliu2050
  • 2016-12-29 18:13:07
  • 2381

spring boot自动化配置原理

spring boot简化开发利器——autoconfigure相关原理。
  • BuquTianya
  • BuquTianya
  • 2017-08-19 19:19:04
  • 1909

[Spring Boot] 4. Spring Boot实现自动配置的原理

入口注解类@EnableAutoConfiguration@SpringBootApplication注解中包含了自动配置的入口注解:@Target(ElementType.TYPE) @Retent...
  • dm_vincent
  • dm_vincent
  • 2017-08-27 12:44:17
  • 1959

springboot webmvc 自动配置

通过WebMvcAutoConfiguration发现Spring Boot做了许多自动配置。   1.自动配置的VeiwResolver ContentNegotiatingViewReso...
  • xiaoliuliu2050
  • xiaoliuliu2050
  • 2017-01-23 15:11:53
  • 1161

Spring Boot集成Redis实现自动配置

通过上面一些笔记的介绍, 我们可以自己动手去集成Redis, 没有什么难度的 还有Spring Boot官方提供了Spring-Data-Redis的Starter POM 有兴趣的可...
  • moonpure
  • moonpure
  • 2017-11-29 11:43:04
  • 246
收藏助手
不良信息举报
您举报文章:Spring boot自动配置
举报原因:
原因补充:

(最多只允许输入30个字)