@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. Git 学习笔记–基本操作

    Git 与 SVN 不同,是分布式的版本控制系统,不需要主服务器即可工作,实际中为了方便各个工作者间同步工作,通常还是会设置主服务器. Git的设置及初始化: 设置全局用户信息: luojiahu@u ...

  2. Java使用zxing生成解读QRcode二维码

    1.maven的pom配置jar包,如果不实用maven请手动下载jar包 <dependency> <groupId>com.google.zxing</groupId ...

  3. 最新版的stm32f1xx.h文件中取消了u8, u16, u32的类型定义

    使用芯片stm32f103zet6和stm32l151c8t6,在移植程序时发现,编译器提示u8未定义: 在Keil MDK 开发环境里,st定义无符号32位整形数据有很多种表示方法: 1 unsig ...

  4. python应用:爬虫框架Scrapy系统学习第一篇——xpath详解

    HTML的三大概念:标签.元素以及属性 标签:尖括号中的文本       例:<head>……</head> 标签通常成对出现 元素:标签中的所有内容        元素中可包 ...

  5. Leecode刷题之旅-C语言/python-121买卖股票的最佳时机

    /* * @lc app=leetcode.cn id=121 lang=c * * [121] 买卖股票的最佳时机 * * https://leetcode-cn.com/problems/best ...

  6. Sql Server char、varchar、nchar、nvarchar的区别

    (1) 定义: char: 固定长度,存储ANSI字符,不足的补英文半角空格. nchar: 固定长度,存储Unicode字符,不足的补英文半角空格 varchar: 可变长度,存储ANSI字符,根据 ...

  7. 十分钟搭建和使用sonarqube代码质量管理平台

    前言 Sonarqube为静态代码检查工具,采用B/S架构,帮助检查代码缺陷,改善代码质量,提高开发速度,通过插件形式,可以支持Java.C.C++.JavaScripe等等二十几种编程语言的代码质量 ...

  8. 机器学习实战:决策树的存储读写文件报错(Python3)

    错误原因:pickle模块存储的是二进制字节码,需要以二进制的方式进行读写 1. 报错一:TypeError: write() argument must be str, not bytes 将决策树 ...

  9. map按值排序

    package com.zhilei.test; import java.util.Comparator;import java.util.HashMap;import java.util.Map;i ...

  10. 调用bash的时候出现curl command not found

    调用bash的时候出现curl command not found 解决办法: apt-get install curl