先说下springboot的运行原理

springboot最主要的配置 是 @SpringBootApplication

然后这里面 @EnableAutoCOnfiguration 最为重要, 继续往里跟

可看到通过 @Import 导入了一个 EnableAutoConfigurationImportSelector 的类

在这个类中, 通过SpringFactoriesLoader.loadFactoryNames方法来扫描所有包下的 spring.factories文件,,, 而在spring-boot-autoconfigure.jar下就有这个文件

点进去几个注解可发现, 都有这么几个注解:

@ConditionalOnBean:              容器中有指定的Bean时
@ConditionalOnMissingBean: 没有 @ConditionalOnClass: 类路径下游指定的类时
@ConditionalOnMissingClass: 没有 @ConditionalOnExpression: 基于spel表达式判断
@ConditionalOnJava: 基于JVM版本判断
@ConditionalOnJndi: 基于JNDI存在的条件下查找指定位置
@ConditionalOnProperty: 指定的属性是否有指定的值
@ConditionalOnResource: 类路径是否有指定的值
@ConditionalOnSingleCadidate: 指定的bean在容器中只有一个, 或者有多个但是指定首选的bean @ConditionalOnWebApplication: 是Web项目的时候
@ConditionalOnNotWebApplication: 不是Web项目的时候

实例分析:

找到 HttpEncodingAutoConfiguration 并点击进去:

配置类: 
@Configuration
@EnableConfigurationProperties(HttpEncodingProperties.class)    // 开启属性注入声明, @Autowired注入
@ConditionalOnWebApplication
@ConditionalOnClass(CharacterEncodingFilter.class)      // 在类路径下
// 配置文件中有这个配置才会生效
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
  
  // 注入properties
private final HttpEncodingProperties properties; public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
this.properties = properties;
}

  // 设置
@Bean
@ConditionalOnMissingBean(CharacterEncodingFilter.class)
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
return filter;
}
}

上面需要一个HttpEncodingProperties, 这儿再看一下

其他属性未列出, 只看需要的:

@ConfigurationProperties(prefix = "spring.http.encoding")
public class HttpEncodingProperties { public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
public Charset getCharset() {
return this.charset;
} public void setCharset(Charset charset) {
this.charset = charset;
}
}

其实是一个用来读取yml配置的安全属性注入的类, 没有配置就默认使用UTF8;

实战

新建一个maven项目:

pom.xml

<!-- springboot的自动配置, 自定义starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>

属性注入类:

package com.wenbronk.core.autoconfig;

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

/**
* 自定义starter的配置类
* Created by wenbronk on 2017/5/18.
*/
@ConfigurationProperties(prefix = "hello")
public class HelloProperties { public static final String MSG = "world"; private String msg = MSG; public void setMsg(String msg) {
this.msg = msg;
} public String getMSG() {
return MSG;
}
}

实例类:

package com.wenbronk.core.autoconfig;

/**
* 执行类
* 根据这个类是否存在, 来创建这个类的Bean
* Created by wenbronk on 2017/5/18.
*/
public class HelloService { private String msg; public String sayHello() {
return "hello" + msg;
} public String getMsg() {
return msg;
} public void setMsg(String msg) {
this.msg = msg;
} }

自动配置类:

package com.wenbronk.core.autoconfig;

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; /**
*
* 自动配置类
* Created by wenbronk on 2017/5/18.
*/
@Configuration
@EnableConfigurationProperties(HelloProperties.class) // 声明开启属性注入, 通过 @Autowired注入
@ConditionalOnClass(HelloService.class)
@ConditionalOnProperty(prefix = "hello", value = "enabled", matchIfMissing = true)
public class AutoConfigHello { @Autowired
private HelloProperties helloProperties; @Bean
@ConditionalOnMissingBean(HelloService.class)
public HelloService helloService() {
HelloService helloService = new HelloService();
helloService.setMsg(helloProperties.getMSG());
return helloService;
} }

如果想要配置生效, 需要在resources/META-INF/spring.propertes

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.wenbronk.core.autoconfig.AutoConfigHello

此时将自己的项目打包, 然后发布在私服上, 就可以在其他项目中通过引入依赖 进行自动开启了

原创地址: http://www.cnblogs.com/wenbronk/p/6873627.html, 转载请注明出处, 谢谢

springboot-22-自定义starter的更多相关文章

  1. (springboot)自定义Starter

    要引入的jar项目,即自定义的Starter项目: pom:(这里不能引入springboot整合否则测试项目注入失败) <?xml version="1.0" encodi ...

  2. SpringBoot编写自定义Starter

    根据SpringBoot的Starter编写规则,需要编写xxxStarter依赖xxxAutoConfigurer,xxxStarter是一个空的jar,仅提供辅助性的依赖管理,引入其他类库 1.建 ...

  3. springboot 简单自定义starter - beetl

    使用idea新建springboot项目beetl-spring-boot-starter 首先添加pom依赖 packaging要设置为jar不能设置为pom<packaging>jar ...

  4. springboot 简单自定义starter - dubbo

    首先需要引入pom 这里使用nacos注册中心 所以引入了nacos-client 使用zookeeper注册中心的话需要引入其相应的client <dependency> <gro ...

  5. SpringBoot应用篇(一):自定义starter

    一.码前必备知识 1.SpringBoot starter机制 SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在mave ...

  6. SpringBoot之旅第六篇-启动原理及自定义starter

    一.引言 SpringBoot的一大优势就是Starter,由于SpringBoot有很多开箱即用的Starter依赖,使得我们开发变得简单,我们不需要过多的关注框架的配置. 在日常开发中,我们也会自 ...

  7. java框架之SpringBoot(10)-启动流程及自定义starter

    启动流程 直接从 SpringBoot 程序入口的 run 方法看起: public static ConfigurableApplicationContext run(Object source, ...

  8. SpringBoot第十六篇:自定义starter

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11058502.html 版权声明:本文为博主原创文章,转载请附上博文链接! 前言   这一段时间 ...

  9. SpringBoot自定义starter及自动配置

    SpringBoot的核心就是自动配置,而支持自动配置的是一个个starter项目.除了官方已有的starter,用户自己也可以根据规则自定义自己的starter项目. 自定义starter条件 自动 ...

  10. SpringBoot自定义Starter实现

    自定义Starter: Starter会把所有用到的依赖都给包含进来,避免了开发者自己去引入依赖所带来的麻烦.Starter 提供了一种开箱即用的理念,其中核心就是springboot的自动配置原理相 ...

随机推荐

  1. ASP.NET Core2基于RabbitMQ对Web前端实现推送功能

    在我们很多的Web应用中会遇到需要从后端将指定的数据或消息实时推送到前端,通常的做法是前端写个脚本定时到后端获取,或者借助WebSocket技术实现前后端实时通讯.因定时刷新的方法弊端很多(已不再采用 ...

  2. vs2008快捷键极其技巧

    vs2008快捷键极其技巧 1. 工具: Microsoft Visual Studio 2008 Version 9.0.21022.8 RTM Microsoft .NET Framework V ...

  3. 扫描指定ip的端口(C#)

    class PingExam { public static void Main() { Ping ping = new Ping(); string ip = "192.168.1.43& ...

  4. 【MVC】视图页引用分部视图(WebForm叫做用户控件)

    方法一.不经过控制器.动作方法,直接返回Html @Html.Partial("Head","我可以给分布视图传数据") Head是Views/Shared/H ...

  5. (zxing.net)一维码EAN 8的简介、实现与解码

    一.简介 一维码EAN 8:属于国际标准条码,由8个数字组成,属EAN的简易编码形式(EAN缩短码).当包装面积小于120平方公分以下无法使用标准码时,可以申请使用缩短码. 依结构的不同,EAN条码可 ...

  6. tinymce与prism代码高亮实现及汉化的配置

    简单介绍:TinyMCE是一个轻量级的基于浏览器的所见即所得编辑器,由JavaScript写成.它对IE6+和Firefox1.5+都有着非常良好的支持.功能方强大,并且功能配置灵活简单.另一特点是加 ...

  7. .NET处理HTTP请求

    第一种:使用HttpWebRequest string result = ""; HttpWebRequest request = (HttpWebRequest)WebReque ...

  8. WP8.1StoreApp(WP8.1RT)---MessageBox与MessageDialog

    在WP7和WP8中,MessageBox是跟WinForm中一样常用的对话框,但是有一个显著的缺点,就是WP7/8中默认的MessageBox是阻塞线程的.也许是由于这个原因,WP8.1/Win8中采 ...

  9. AI-Info-Micron:人如其食:人工智能和人类微生物组

    ylbtech-AI-Info-Micron:人如其食:人工智能和人类微生物组 1.返回顶部 1. 人如其食:人工智能和人类微生物组 “相信你身体发出的信号”,的确是一个很好的建议.研究人员在不遗余力 ...

  10. win7 virtio 驱动下载

    下载地址: https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/