Spring Boot自动配置实例

spring boot之所以能够自动配置bean,是通过基于条件来配置Bean的能力实现的。

常用的条件注解如下

  1. @ConditionalOnBean:当容器里存在指定的Bean的条件下
  2. @ConditionalOnClass:当前类路径下存在指定的类的条件下
  3. @ConditionalOnExpression:基于SpEL表达式作为判断条件
  4. @ConditionalOnJava:基于JVM版本作为判断条件
  5. @ConditionalOnJndi:在JNDI存在的条件下查找指定的位置
  6. @ConditionalOnMissingBean:当容器里没有指定的Bean的条件下
  7. @ConditionalOnMissingClass:当前类路径下没有指定的类的条件下
  8. @ConditionalOnNotWebApplication:当前项目不是web项目的条件下
  9. @ConditionalOnProperty:指定的属性是否有指定的值的条件下
  10. @ConditionalOnResource:类路径下是否有指定的值
  11. @ConditionalOnSingleCandidate:指定Bean在容器中只有一个,或者虽然有多个但是指定首选的Bean
  12. @ConditionalOnWebApplication:当前项目是Web项目的条件下

这些注解都组合了@Conditional注解,只是使用了不同的条件。

接下来我们自己写一个自动配置,并且封装成starter pom。

首先创建maven工程,导入以下依赖:

<dependency>
    	<groupId>org.springframework.boot</groupId>
	    <artifactId>spring-boot-autoconfigure</artifactId>
	    <version>1.3.8.RELEASE</version>
    </dependency>

工程结构如下

创建AuthorProperties类,作为配置信息的载体

package com.springboot.springboot_starter_hello;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix="author")//指定配置内容的前缀
public class AuthorProperties {

	private static final String NAME = "微儿博客";

	private static final int AGE = 18;

	private String name = NAME;//默认为微儿博客

	private int age = AGE;//默认为18

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

创建AuthorService类,作为Bean

package com.springboot.springboot_starter_hello;

public class AuthorService {

	private String name;

	private int age;

	public String who(){
		return "name:"+name+",age:"+age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

创建配置类AuthorServiceAutoConfiguration,负责配置Bean

package com.springboot.springboot_starter_hello;

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.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration//声明配置类
@EnableConfigurationProperties(AuthorProperties.class)
@ConditionalOnClass(AuthorService.class)//类路径下存在AuthorService类的条件下
@ConditionalOnProperty(prefix="author",value="enabled",matchIfMissing=true)//在前缀为author的配置为enabled的情况下,即author=enabled,没有配置默认为enabled
public class AuthorServiceAutoConfiguration {

	@Autowired
	private AuthorProperties authorProperties;

	@Bean
	@ConditionalOnMissingBean(AuthorService.class)//容器中没有AuthorService的Bean的条件下配置该Bean
	public AuthorService authorService(){
		AuthorService authorService = new AuthorService();
		authorService.setName(authorProperties.getName());
		authorService.setAge(authorProperties.getAge());
		return authorService;
	}
}

若想自动配置生效,需要注册自动配置类。在src/main/resources下创建META-INF/spring.factories文件,并写入以下内容:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.springboot.springboot_starter_hello.AuthorServiceAutoConfiguration

若有多个自动配置类,则用","隔开,此处“\”是为了换行后仍能读到属性。

以上操作完成后执行maven install。

然后在Spring Boot项目中引入该依赖:

<dependency>
	<groupId>com.springboot</groupId>
	<artifactId>springboot-starter-hello</artifactId>
	<version>0.0.1-SNAPSHOT</version>
</dependency>

新建AutoConfig类:

package com.springboot.autoconfig;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.springboot.springboot_starter_hello.AuthorService;

@SpringBootApplication
@RestController
public class AutoConfig {

	@Autowired
	private AuthorService authorService;

	@RequestMapping("/")
	public String who(){
		return authorService.who();
	}

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

运行该类,访问localhost:8080,出现如下结果:name:微儿博客,age:18

接下来在src/main/resources下新建application.properties文件,写入以下内容:

author.name=weare
author.age=19

重新运行AutoConfig类:name:weare,age:19

原文链接:点击访问

更多文章请访问微儿博客

时间: 2024-08-11 07:36:47

Spring Boot自动配置实例的相关文章

Spring Boot自动配置原理(转)

第3章 Spring Boot自动配置原理 3.1 SpringBoot的核心组件模块 首先,我们来简单统计一下SpringBoot核心工程的源码java文件数量: 我们cd到spring-boot-autoconfigure工程根目录下.执行 $ tree | grep -c .java$ 模块 java文件数 spring-boot 551 spring-boot-actuator 423 spring-boot-autoconfigure 783 spring-boot-devtools

4、Spring Boot 自动配置原理

1.4 Spring Boot 自动配置原理 简介 spring boot自动配置功能可以根据不同情况来决定spring配置应该用哪个,不应该用哪个,举个例子: Spring的JdbcTemplate是不是在Classpath里面?如果是,并且DataSource也存在,就自动配置一个JdbcTemplate的Bean Thymeleaf是不是在Classpath里面?如果是,则自动配置Thymeleaf的模板解析器.视图解析器.模板引擎 那个这个是怎么实现的呢?原因就在于它利用了Spring的

Springboot 系列(三)Spring Boot 自动配置

注意:本 Spring Boot 系列文章基于 Spring Boot 版本 v2.1.1.RELEASE 进行学习分析,版本不同可能会有细微差别. 前言 关于配置文件可以配置的内容,在 Spring Boot 官方网站已经提供了完整了配置示例和解释. 可以这么说,Spring Boot 的一大精髓就是自动配置,为开发省去了大量的配置时间,可以更快的融入业务逻辑的开发,那么自动配置是怎么实现的呢? 1. @SpringBootApplication 跟着 Spring Boot 的启动类的注解

Spring Boot 自动配置之@Conditional的使用

Spring Boot自动配置的"魔法"是如何实现的? 转自-https://sylvanassun.github.io/2018/01/08/2018-01-08-spring_boot_auto_configure/ Spring Boot是Spring旗下众多的子项目之一,其理念是约定优于配置,它通过实现了自动配置(大多数用户平时习惯设置的配置作为默认配置)的功能来为用户快速构建出标准化的应用.Spring Boot的特点可以概述为如下几点: 内置了嵌入式的Tomcat.Jett

Spring Boot自动配置类

http://docs.spring.io/spring-boot/docs/current/api/overview-summary.html http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#auto-configuration-classes 前提 1.一般来说,xxxAware接口,都提供了一个setXxx的方法,以便于其实现类将Xxx注入自身的xxx字段中,从而进行操作. 例如 Applicatio

Spring Boot自动配置源码解析(基于Spring Boot 2.0.2.RELEASE)

在Spring Boot官方介绍中,首一段话是这样的(如下图).我们可以大概了解到其所表达的含义:我们可以利用Spring Boot写很少的配置来创建一个非常方便的基于Spring整合第三方类库的单体企业级应用.相信使用过Spring Boot的人都知道,她在这方面从前到后的一系列整合.本篇文字将带你进入具体的实现细节. 首先我们写一段Spring Boot应用启动类的代码如下: 1 package com.springTest; 2 3 import org.springframework.b

spring boot 自动配置原理

1).spring boot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration 2).通过@EnableAutoConfiguration中AutoConfigurationImportSelector给容器中导入了一系列的组件通过List<String> configurations = getCandidateConfigurations(annotationMetadata,attributes);获取候选的配置,下一步通过SpringFactor

spring boot自动配置实现

自从用了spring boot,都忘记spring mvc中的xml配置是个什么东西了,再也回不去.为啥spring boot这么好用呢, 约定大于配置的设计初衷, 让我们只知道维护好application.properties(或application.yml)文件就可以了,我们在配置文件里可以设置数据源参数,可以设置服务端口,可以设置redis的地址等等.我们经常会看一些包含starter名字的jar包,如spring-boot-starter-data-redis,引入这些jar包,我们就

Spring Boot自动配置总结

Spring Boot项目启动的时候加载主配置类,并开启了自动配置功能.(Spring Boot的自动配置功能是Spring Boot的一大重要且突出的特性) 那么我们需要了解下它: 如何加载主配置类? 通过@SpringBootApplication的注解来找到并加载主配置类. 如何开启自动配置功能? 点进@SpringBootApplication的源码后可以发现这样一段代码,说明@SpringBootApplication注解由多个注解组成. 其中,自动配置功能主要就是依靠@EnableA