栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

7月老师全栈课 - springboot条件注解与配置

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

7月老师全栈课 - springboot条件注解与配置

2021年10月5日

【springboot条件注解与配置】

1、@Autowired 的几种注入方式

(1)字段或者成员变量注入;
(2)setter注入;
(3)构造函数注入。

2、指定包扫描注解 @ComponentScan

@ComponentScan("包的全路径")

默认springboot 默认扫描的是 与启动类同级或者 启动类的子级文件中 被@Component注解标识的类,它会把这些类加入到IOC容器中去。


3、把bean注入到使用类中的几种策略方式

(1)通过 byname 或 bytype方式;
(2)@Qualifier 指定bean的名字;
(3)有选择的只注入一个bean,注释掉某个bean 上的 @Component;
(4)通过 在标识@Component注解的类上添加 @Primary 注解,来标明这个bean优先级最高。

例:两个类同时实现了 Person接口,但是 ImplA类 添加了 @Primary注解,所以在注入Person类型的bean时,ImplA这个bean的优先级最高。

 把Person类型的bean 注入到 使用类中:

 

 

 4、条件注解

(1)自定义条件注解:

@Conditional 注解,可以编写自定义条件注解,还要加上实现 Condition 接口。

package com.example.javabase.myCondition;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypemetadata;

// 原理: 如果返回true,就会把bean 加入到容器中去,否则,不会加入到容器中
public class Mycondition implements Condition {
    @Override
    public boolean matches(
            ConditionContext conditionContext, 
            AnnotatedTypemetadata annotatedTypemetadata
    ) {
        return true;
    }
}

使用自定义的条件注解:

@Configuration
public class JoinBeanToRQ {
    @Bean
    public A setABean() {
        return new A("lxc", 20);
    }

    // 直接在 要添加到容器的bean上使用条件注解,参数是我们自己写的条件注解
    @Bean
    @Conditional(Mycondition.class)
    public B setBBean() { return new B("B", 21); }
}

(2)Condition 接口的参数  - conditionContext

通过 ConditionContext 可以获取系统环境中的各种信息, 接口中的方法 getEnvironment() 可获取到配置文件中的属性:

public class Mycondition implements Condition {
    @Override
    public boolean matches(
            ConditionContext conditionContext,
            AnnotatedTypemetadata annotatedTypemetadata
    ) {

        // 如果配置文件中的author.name属性值为 "lxc",那么返回true
        String name = conditionContext.getEnvironment().getProperty("author.name");
        return "lxc".equalsIgnoreCase(name);
    }
}

 例:

B实现了Person接口,在加入到IOC容器时,使用 @Conditional注解判断,如果配置文件中 有 author.name = lxc ,那么 B类会被加入到 IOC 容器中

在使用类中注入Person类型的bean

 注入Person类型的bean:

 

 (3)内置成品条件注解

        1> @ConditionalOnProperty(value="key",  havingValue="value") 

下边案例中,如果配置文件中 放入author.name = lxc, A类会被加入到 ioc容器中;如果author.name = B , B类会被加入到容器中去。

 @ConditionalOnProperty(value="key", havingValue="value", matchIfMissing=true)

参数三 matchIfMissing=true 是如果配置文件中,没有 key的时候, 被标识的类才会被加入到配置文件中去,起到一个默认值的作用。

 第三个参数是非常有用的,在实际开发中,如果我们写了一个组件,组件的配置策略可以让开发者自己在配置文件中配置,当然,如果开发者没有在配置文件中配置,我们可以使用 该注解 使用默认的配置策略。

         2> @ConditionalOnProperty(name="IOC容器中的bean名字")  只有IOC容器中有name="xxx" 的Bean,被标识类才会被加入到IOC容器中。

下边案例,只有IOC容器中有名字为 setBBean 的Bean,B类才会被加入到容器中去。

 补充下:

使用 @Configuration 注解会把一组Bean加入到IOC容器中,此时,如果想用具体的Bean,Bean的名字就是 @Bean标注的方法的名字。 

         3> @ConditionalOnMissingBean(name="IOC容器中的bean名字")  与 @ConditionalOnBean相反, 只有IOC容器中没有name="xxx" 的Bean,被标识的类才会被加入到IOC容器中去:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/294267.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号