Spring Boot(三)自动装配
@Configuration和@Bean
Spring提供了注解@Configuration和@Bean注解用来配置多个Bean,在以前的Spring项目中可以通过xml的方式配置:
- <beans>
- <bean id=”xxxBean” class="aaa.bbb.xxxBean"></bean>
- </beans>
采用Configuration注解的方式如下:
- //@SpringBootConfiguration
- @Configuration
- public class TestConfiguration {
- @Bean
- public EncodingConvert createUTF8EncodingConvert(){
- return new UTF8EncodingConvert();
- }
- @Bean
- public EncodingConvert createGBKEncodingConvert(){
- return new GBKEncodingConvert();
- }
- }
上面代码中TestConfiguration类使用注解@ Configuration,向Spring表明这是一个配置类,类里的含有@Bean注解的方法都会被Spring调用,返回对象将会为Spring容器管理的Bean,注解@Bean可以给Bean指定一个名称,如@Bean(“xxxBean”),如不指定,则将会以该方法名作为Bean的名称
条件装配
Spting Boot提供一系列@ConditionalOnXXX的注解用于不同场景下的Bean装配。基本上通过注解名称就能明白用途,@ConditionalOnXXX注解可以作用于类或者方法上。
1.作用用于类上,需要和 @Configuration注解一起使用,决定该配置类是否生效
2.作用于方法上,需要和@Bean注解一起使用,判断该@Bean是否生成
Bean条件装配
Spring Boot可以通过有没有指定Bean来决定是否配置当前Bean,
使用@ConditionalOnBean,在当前上下文中存在某个对象时,才会实例化当前Bean;
使用@ConditionalOnMissingBean,在当前上下文中不存在某个对象时,才会实例化当前Bean。
- @Configuration
- @ConditionalOnBean(PropertiesConfig.class)
- public class TestConfiguration {
- @Bean
- @ConditionalOnMissingBean
- public EncodingConvert createUTF8EncodingConvert(){
- return new UTF8EncodingConvert();
- }
- @Bean
- public EncodingConvert createGBKEncodingConvert(){
- return new GBKEncodingConvert();
- }
- }
TestConfiguration配置生效的前提是当前上下文中已经配置了PropertiesConfig。
如果当前上下文中没有UTF8EncodingConvert类型Bean,则调用createUTF8EncodingConvert创建。
Class条件装配
Class条件装配是按照某个类是否在Classpath中来判断是否需要配置Bean。
@ConditionalOnClass:表示classpath有指定的类时,配置才生效
@ConditionalOnMissingClass:表示当classpath中没有指定类,则配置生效
- @Configuration
- @ConditionalOnClass(JestClient.class)
- //@ConditionalOnClass(name="com.sl.springbootdemo.JestClient")
- public class JestAutoConfiguration{
- }
Environment装配
Spring Boot可以根据Environment属性来决定是否实例化Bean,通过@ConditionalOnProperty注解来实现。根据注解属性name读取Spring Boot的Environment的变量包含的属性 ,再根据属性值与注解属性havingValue的值比较,判断否实例化Bean,如果没有指定注解属性havingValue,name只要environment属性值不为false,都会实例化Bean。MatchIfMissing=true,表示如果evironment没有包含message.center.enavled属性,也会实例化Bean,默认是false。
- @Bean
- @ConditionalOnProperty(name="com.sl.Encoding",havingValue = "GBK",matchIfMissing = false)
- public EncodingConvert createGBKEncodingConvert(){
- return new GBKEncodingConvert();
- }
其他条件装配注解:
@ConditionalOnExpression :当表达式为true时,才会实例化一个Bean,支持SpEL表达式
@ConditionalOnNotWebApplication:表示不是web应用,才会实例化一个Bean
Condition接口(自定义条件装配)
当Spring Boot提供的一些列@ConditionalOnXXX注解无法满足需求时,也可以手动构造一个Condition实现,使用注解@Conditional来引用Condition实现。
Condition接口定义:
- @FunctionalInterface
- public interface Condition {
- /**
- * Determine if the condition matches.
- * @param context the condition context
- * @param metadata metadata of the {@link org.springframework.core.type.AnnotationMetadata class}
- * or {@link org.springframework.core.type.MethodMetadata method} being checked
- * @return {@code true} if the condition matches and the component can be registered,
- * or {@code false} to veto the annotated component's registration
- */
- boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
- }
参数ConditionContext类可以获取用于帮助条件判断的辅助类:
1.Environment:读取系统属性、环境变量、配置参数等。
2.ResourceLoader:加载判断资源文件
3.ConfigurableListableBeanFactory:Srping容器
下面是一个实现示例,当application.properties配置文件中存在配置file.encoding=GBK时才创建Bean实例
- public class GBKCondition implements Condition {
- public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata){
- String encoding = context.getEnvironment().getProperty("file.encoding");
- if("gbk".equals(encoding.toLowerCase())){
- return true;
- }
- return false;
- }
- }
使用:
- @Bean
- @Conditional(GBKCondition.class) //使用自定义Condition
- public EncodingConvert createGBKEncodingConvert(){
- return new GBKEncodingConvert();
- }
Spring Boot(三)自动装配的更多相关文章
- 【面试普通人VS高手系列】Spring Boot中自动装配机制的原理
最近一个粉丝说,他面试了4个公司,有三个公司问他:"Spring Boot 中自动装配机制的原理" 他回答了,感觉没回答错误,但是怎么就没给offer呢? 对于这个问题,看看普通人 ...
- 精选Spring Boot三十五道必知必会知识点
Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家.本文精选了三十五个常见的Spring Boot知识点,祝你一臂之力! 问题一 Spr ...
- Java精选面试题之Spring Boot 三十三问
Spring Boot Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一: Spring Boot.Spring MVC 和 ...
- spring boot 系列之六:深入理解spring boot的自动配置
我们知道,spring boot自动配置功能可以根据不同情况来决定spring配置应该用哪个,不应该用哪个,举个例子: Spring的JdbcTemplate是不是在Classpath里面?如果是,并 ...
- Spring(六)之自动装配
一.自动装配模型 下面是自动连接模式,可以用来指示Spring容器使用自动连接进行依赖注入.您可以使用元素的autowire属性为bean定义指定autowire模式. 可以使用 byType 或者 ...
- Spring Boot的自动配置原理及启动流程源码分析
概述 Spring Boot 应用目前应该是 Java 中用得最多的框架了吧.其中 Spring Boot 最具特点之一就是自动配置,基于Spring Boot 的自动配置,我们可以很快集成某个模块, ...
- 初识Spring Boot框架(二)之DIY一个Spring Boot的自动配置
在上篇博客初识Spring Boot框架中我们初步见识了SpringBoot的方便之处,很多小伙伴可能也会好奇这个Spring Boot是怎么实现自动配置的,那么今天我就带小伙伴我们自己来实现一个简单 ...
- Spring boot 的自动配置
Xml 配置文件 日志 Spring Boot对各种日志框架都做了支持,我们可以通过配置来修改默认的日志的配置: #设置日志级别 logging.level.org.springframework=D ...
- Spring boot 国际化自动加载资源文件问题
Spring boot 国际化自动加载资源文件问题 最近在做基于Spring boot配置的项目.中间遇到一个国际化资源加载的问题,正常来说只要在application.properties文件中定义 ...
- Spring Boot 排除自动配置的 4 种方法,关键时刻很有用!
Spring Boot 提供的自动配置非常强大,某些情况下,自动配置的功能可能不符合我们的需求,需要我们自定义配置,这个时候就需要排除/禁用 Spring Boot 某些类的自动化配置了. 比如:数据 ...
随机推荐
- 【Spark】Spark2.x版的新特性
一.API 1. 出现新的上下文接口:SparkSession,统一了SQLContext和HiveContext,并且为SparkSession开发了新的流式调用的configuration API ...
- 【Spark】源码分析之SparkContext
一.概述 SaprkContext非常重要,是Spark提交任务到集群的入口 SparkContext中没有main方法,在SparkContext主构造器中,主要做一下四件事情: 1. 调用crea ...
- PHP的高效率写法
1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显. 其实静态方法和非静态方法的 ...
- VUE通过索引值获取数据不渲染的问题
问题:vue里面当通过索引值获取数据时,ajax数据成功返回,但是在火狐下不渲染 解决:
- day 29 socketserver ftp功能的简单讲解
1.上传下载的简单示例 server: import socket import struct import json server =socket.socket() server.bind((' ...
- 嵌入式C语言自我修养 01:Linux 内核中的GNU C语言语法扩展
1.1 Linux 内核驱动中的奇怪语法 大家在看一些 GNU 开源软件,或者阅读 Linux 内核.驱动源码时会发现,在 Linux 内核源码中,有大量的 C 程序看起来“怪怪的”.说它是C语言吧, ...
- Python 爬虫 (三)
#对第一章的百度翻译封装的函数进行更新 1 from urllib import request, parse from urllib.error import HTTPError, URLError ...
- Python3 urllib 与 Python2 urllib的变化
Infi-chu: http://www.cnblogs.com/Infi-chu/ Py2.x: Urllib库 Urllin2库 Py3.x: Urllib库 变化: 在Pytho2.x中使用im ...
- ACM数论-素数
ACM数论——素数 素数定义: 质数(prime number)又称素数,有无限个.质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数,这样的数称为质数.例 子:2.3.5.7.11.1 ...
- 【8086汇编-Day6】关于loop的实验
实验内容 因为是要复制代码,所以常规来做是取代码段地址来用,所以把cs值mov给ax,但是这只是临时的,ax之后还有别的用途,那就把指令当作数据来存(把ax值 mov给ds,表示这一段地址用作代码段, ...