@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(三)自动装配的更多相关文章

  1. 【面试普通人VS高手系列】Spring Boot中自动装配机制的原理

    最近一个粉丝说,他面试了4个公司,有三个公司问他:"Spring Boot 中自动装配机制的原理" 他回答了,感觉没回答错误,但是怎么就没给offer呢? 对于这个问题,看看普通人 ...

  2. 精选Spring Boot三十五道必知必会知识点

    Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家.本文精选了三十五个常见的Spring Boot知识点,祝你一臂之力! 问题一 Spr ...

  3. Java精选面试题之Spring Boot 三十三问

    Spring Boot Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一: Spring Boot.Spring MVC 和 ...

  4. spring boot 系列之六:深入理解spring boot的自动配置

    我们知道,spring boot自动配置功能可以根据不同情况来决定spring配置应该用哪个,不应该用哪个,举个例子: Spring的JdbcTemplate是不是在Classpath里面?如果是,并 ...

  5. Spring(六)之自动装配

    一.自动装配模型 下面是自动连接模式,可以用来指示Spring容器使用自动连接进行依赖注入.您可以使用元素的autowire属性为bean定义指定autowire模式. 可以使用 byType 或者  ...

  6. Spring Boot的自动配置原理及启动流程源码分析

    概述 Spring Boot 应用目前应该是 Java 中用得最多的框架了吧.其中 Spring Boot 最具特点之一就是自动配置,基于Spring Boot 的自动配置,我们可以很快集成某个模块, ...

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

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

  8. Spring boot 的自动配置

    Xml 配置文件 日志 Spring Boot对各种日志框架都做了支持,我们可以通过配置来修改默认的日志的配置: #设置日志级别 logging.level.org.springframework=D ...

  9. Spring boot 国际化自动加载资源文件问题

    Spring boot 国际化自动加载资源文件问题 最近在做基于Spring boot配置的项目.中间遇到一个国际化资源加载的问题,正常来说只要在application.properties文件中定义 ...

  10. Spring Boot 排除自动配置的 4 种方法,关键时刻很有用!

    Spring Boot 提供的自动配置非常强大,某些情况下,自动配置的功能可能不符合我们的需求,需要我们自定义配置,这个时候就需要排除/禁用 Spring Boot 某些类的自动化配置了. 比如:数据 ...

随机推荐

  1. C# 发送Http协议 模拟 Post Get请求

    1.参数 paramsValue的格式 要和 Reques.ContentType一致, 如果 contentype  "application/x-www-form-urlencoded& ...

  2. 关于一个flask的服务接口实战(flask-migrate,flask-script,SQLAlchemy)

    前言 最近接到一个接收前端请求的需求,需要使用python编写,之前没有写过python,很多技术没有用过,在这里做一个学习记录,如有错误,请不了赐教. Flask Api文档管理 使用Falsk A ...

  3. 全志A64 QT移植

    1. 把编译工具 gcc-linaro-aarch64.tar.xz 添加到环境.bashrc 中 2. 下载 tslib-1.4.tar.gz ,libiconv-1.15.tar.gz ,qt-e ...

  4. Qt上FFTW組件的编译与安裝

    Qt上FFTW組件的編譯安裝 FFTW是一個做頻譜非常實用的組件,本文講述在Windows和Linux兩個平臺使用FFTW組件.Windows下的的FFTW組件已經編譯好成爲dll文件,按照開發應用的 ...

  5. Linux内核调用I2C驱动_驱动嵌套驱动方法

    禁止转载!!!! Linux内核调用I2C驱动_以MPU6050为例 0. 导语 最近一段时间都在恶补数据结构和C++,加上导师的事情比较多,Linux内核驱动的学习进程总是被阻碍.不过,十一假期终于 ...

  6. gsl 复数

    一.复数的表示 复数的两种表示: gsl复数结构的声明和部分宏在gsl_complex.h中,方法的声明和另一部分宏在gsl_complex_math.h.复数的表示(结构)有三种,即float型.d ...

  7. 20145209刘一阳《网络对抗》Exp6信息搜集与漏洞扫描

    20145209刘一阳<网络对抗>Exp6信息搜集与漏洞扫描 实践内容 信息搜集和漏洞扫描 信息搜集 whois查询 用whois查询博客园网站的域名注册信息可以得到注册人的名字.城市等信 ...

  8. MVC PartialView 方式实现点击加载更多

    <table id="MovieListing"> </table><div> <button id="btnShowMore& ...

  9. 北京Uber优步司机奖励政策(1月25日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  10. 【LG1527】[国家集训队]矩阵乘法

    [LG1527][国家集训队]矩阵乘法 题面 洛谷 题解 我也不知道为什么取个这样的名字... 其实就是区间\(kth\)扩展到二维 还是用整体二分搞啦,把树状数组换成二维的 其他的基本没有什么差别 ...