SpringBoot原理篇:bean的加载控制(注解式)、@ConditionalOnClass、@ConditionalOnMissingClass、 @ConditionalOnBean

目录

一 @ConditionalOnClass和@ConditionalOnMissingClass

1.1 @ConditionalOnClass

 1.2 @ConditionalOnMissingClass

 二 @ConditionalOnBean

使用位置1

使用位置2


导springboot的坐标

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>2.5.4</version>
</dependency>

一 @ConditionalOnClass和@ConditionalOnMissingClass

1.1 @ConditionalOnClass

@ConditionalOnClass → 如果有属性里的 class就加载对应的bean

package com.qing.config;

import com.qing.bean.Cat;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;


public class SpringConfig1 {

    @Bean
    //@ConditionalOnClass :如果有属性里的 class就加载方法返回的cat bean
//  @ConditionalOnClass(Mouse.class)
    @ConditionalOnClass(name="com.qing.bean.Mouse")
    public Cat cat(){
        return new Cat();
    }
}

结果:有mouse 类 所以加载cat bean

 1.2 @ConditionalOnMissingClass

@ConditionalOnMissingClass → 如果没有属性里的class才加载对应的bean

package com.qing.config;

import com.qing.bean.Cat;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.context.annotation.Bean;


public class SpringConfig1 {

    @Bean
    //@ConditionalOnMissingClass :如果没有属性里的 class就加载方法返回的cat bean
    @ConditionalOnMissingClass("com.qing.bean.Mouse")
    public Cat cat(){
        return new Cat();
    }
}

 结果:有mouse 类 所以不加载cat bean

 二 @ConditionalOnBean

使用位置1

@ConditionalOnBean → 如果spring容器里有属性里写的bean,就加载对应的bean

package com.qing.config;

import com.qing.bean.Cat;
import com.qing.bean.Mouse;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;


@Import(Mouse.class)
public class SpringConfig2 {

    @Bean
    @ConditionalOnBean(Mouse.class)
    public Cat cat(){
        return new Cat();
    }

}

结果:

spring容器里有mouse bean,所以加载了cat bean

 改一下

spring容器里没有mouse bean了,所以不加载cat bean

使用位置2

spring容器中有jerry就有cat

package com.qing.bean;

import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnNotWebApplication;
import org.springframework.stereotype.Component;

@Component
@ConditionalOnBean(name = "jerry")
//@ConditionalOnNotWebApplication
public class Cat {
}
package com.qing.bean;

import org.springframework.stereotype.Component;

@Component("jerry")
public class Mouse {

}
package com.qing.config;

import org.springframework.context.annotation.ComponentScan;


@ComponentScan("com.qing.bean")
public class SpringConfig3 {

}

结果

spring容器中没有jerry就没有cat

@ConditionalOn.. 注解还有很多,都是不仅可以用在方法上,还可以直接用在类上

总结

有mouse 类就返回cat bean

多个 condition的条件是叠加的,&的关系

有mouse 类,并且没有wolf 类就返回cat bean

 spring容器里有mouse bean就返回cat bean

  spring容器里有mouse bean就返回cat bean

  spring容器里有名字叫jerry的bean就返回cat bean

 

 有mouse的类并且没有dog类,并且非web环境 就返回 cat bean

有jdbc driver类时才加载druidSource →  自适应加载

猜你喜欢

转载自blog.csdn.net/m0_45877477/article/details/125678355