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();
}

原文地址:https://www.cnblogs.com/ashleyboy/p/9425179.html

时间: 2024-08-16 02:41:11

Spring Boot(三)自动装配的相关文章

Spring(六)之自动装配

一.自动装配模型 下面是自动连接模式,可以用来指示Spring容器使用自动连接进行依赖注入.您可以使用元素的autowire属性为bean定义指定autowire模式. 可以使用 byType 或者 constructor 自动装配模式来连接数组和其他类型的集合. 自动装配的局限性 当自动装配始终在同一个项目中使用时,它的效果最好.如果通常不使用自动装配,它可能会使开发人员混淆的使用它来连接只有一个或两个 bean 定义.不过,自动装配可以显著减少需要指定的属性或构造器参数,但你应该在使用它们之

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

Spring Boot Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一: Spring Boot.Spring MVC 和 Spring 有什么区别? SpringFrame SpringFramework 最重要的特征是依赖注入.所有 SpringModules 不是依赖注入就是 IOC 控制反转. 当我们恰当的使用 DI 或者是 IOC 的时候,我们可以开发松耦合应用.松耦合应用的单元测试可以很容易的进行. Spr

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

Spring Boot.Spring MVC 和 Spring 有什么区别? 1.Spring Spring最重要的特征是依赖注入.所有 SpringModules 不是依赖注入就是 IOC 控制反转. 当我们恰当的使用 DI 或者是 IOC 的时候,我们可以开发松耦合应用.松耦合应用的单元测试可以很容易的进行. 2.Spring MVC Spring MVC 提供了一种分离式的方法来开发 Web 应用.通过运用像 DispatcherServelet,MoudlAndView 和 ViewRe

Spring 源码(九)@Autowired注解实现原理(Spring Bean的自动装配

@Autowired注解的实现过程,其实就是Spring Bean的自动装配过程.通过看@Autowired源码注释部分我们可以看到@Autowired的实现是通过AutowiredAnnotationBeanPostProcessor后置处理器中实现的. AutowiredAnnotationBeanPostProcessor 类图 PriorityOrdered:确认 AutowiredAnnotationBeanPostProcessor 后置处理器的执行优先级 BeanFactoryAw

Spring 源码(九)@Autowired注解实现原理(Spring Bean的自动装配)

@Autowired注解的实现过程,其实就是Spring Bean的自动装配过程.通过看@Autowired源码注释部分我们可以看到@Autowired的实现是通过AutowiredAnnotationBeanPostProcessor后置处理器中实现的. AutowiredAnnotationBeanPostProcessor 类图 PriorityOrdered:确认 AutowiredAnnotationBeanPostProcessor 后置处理器的执行优先级BeanFactoryAwa

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

Spring boot 国际化自动加载资源文件问题 最近在做基于Spring boot配置的项目.中间遇到一个国际化资源加载的问题,正常来说只要在application.properties文件中定义正确的资源文件路径,Spring boot就启动时就会自动加载资源. spring.messages.basename=i18n/message 但是我的项目修改后获取消息时系统报错,找不到对应语言的资源配置.于是试图找到原因.Google好久都没找到,简直好像就我一个人遇到这鬼问题一样??.只好自

Spring IOC容器-自动装配

1 autowire="byName" 根据名称自动装配,自动去IOC容器中找与属性名同名的引用的对象,并自动注入. <!-- ###############自动装配############### --> <bean id="userDao" class="d_auto.UserDao"></bean> <bean id="userService" class="d_auto

Spring框架之自动装配

Spring的IoC容器通过Java反射机制了解了容器中所存在Bean的配置信息,这包括构造方法的结构,属性的信息,而正是由于这个原因,Spring容器才能通过某种规则来对Bean进行自动装配,而无须通过显式的方法进行配置. 一.自动装配类型:Spring IoC容器可以自动装配相互协作Bean之间的关联关系.因此,可以自动使Spring通过检查BeanFactory中的内容,来指定Bean协作(其它被依赖的Bean),,下面来介绍这4种类型: 1.byName类型:根据属性名自动装配.此类型将

Spring中类型自动装配--byType

在Spring中,"类型自动装配"的意思是如果一个bean的数据类型与其它bean属性的数据类型相同,将自动兼容装配它. 例如,一个"persion" bean 公开以"ability"类数据类型作为属性,Spring会找到ability类相同的数据类型,并自动装配它的Bean.如果没有匹配找到,它什么也不做. package auto_w; /** * Created by luozhitao on 2017/8/8. */ public cl

Spring中的自动装配案例分析

Spring_Autowiring collaborators 在Spring3.2.2中自动装配类型,分别为:no(default)(不采用自动装配).byName,byType,constructor下面来分别介绍一下这些是如何自动装配的 <bean id="foo" class="...Foo" autowire="autowire type"> Mode Explanation no (Default) No autowiri