1、@Configuration、@Bean、@Import()、@ImportResource()、@Conditional

  • 分析源码的时候总会见到标题中的这几个注解,因此:弄一篇博客来说明一下吧,方便分析源码

  • 我的项目结构如下

    • 14 - springboot的@Configuration、@Bean、@Import()、@ImportResource()、@Conditional说明


  • 源码说明如下

package cn.zixieqing.testannotation;

import ch.qos.logback.core.db.DBHelper;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.*;

/**
 * @ClassName Test
 * @Author ZiXieQing
 * @Date 2021/11/28
 * Version 1.0
 **/

/*
*    1、@Configuration 和 @Bean搭配
*       @Configuration 表明被注解的类是一个配置类   也就是代指:以前的application.xml文件
*                      这个注解可以跟一个属性 proxyBeanMethods = false / true
*                          为true时  表示:full模式   即:把用了这个注解的东西丢到IOC容器中去 并且:是一个单例的 底层默认是这个
*                          为false时 表示:lite模式   即:和full相反  丢到IOC容器中的东西不是单例的,也就是:每次都不一样嘛
*                          开发中这两种模式的最佳搭配:
*                              1、当前的这个配置类中的其他组件之间没有依赖关系时,就用lite模式  这样springboot启动会快得多
*                              2、当前的这个配置类中的其他组件之间有依赖关系时,就用full模式,如:如:紫邪情组件 要依赖 money组件
*
*       @Bean       指的是:把用了这个注解的东西 丢到spring的IOC容器中去   和以前的application.xml中的<bean>标签是一样的
*
*   2、@Import()  导入组件 底层是一个接口  ()里面的参数是一个Class[] ----->  Class<?>[] value()
*       指的是:把某一个组件导入到spring的IOC容器中去,导入之后我们就可以直接从容器中拿了
*
*   3、@ImportResource()    指的是:导入资源文件( 配置文件 )    简单来说:就是以前玩spring中编写的application.xml文件
*                                    用了这个注解之后,就可以不采用这种注解的方式,而是用以前的xml配置文件的形式编写配置
*
*   4、@ConditionalOnBean()    专业名词:条件装配   指的是:有xxxx某个对象时  才装配到IOC容器中去
*                                     ()里面一般使用 对象值 和 对象名字   Class<?>[] value() / String[] name()
*                              Conditional标记方式还有其他的
*
 * */


@Configuration(proxyBeanMethods = true)     // 表明这是一个配置
@Import(DBHelper.class)     // 这样就把这个DBHelper组件给导入到我们当前的IOC容器中来了,我们需要的时候就可以直接拿了
@ImportResource("classpath:application.xml")
@ConditionalOnBean(name = "zixieqing.class")
public class Test {

    @Bean       // 把test1丢到IOC容器中去
    public void test1() {

        System.out.println("就简单的输出一个话吧");

    }
}




2、附1:@Conditional中的另外注解说明

14 - springboot的@Configuration、@Bean、@Import()、@ImportResource()、@Conditional说明

14 - springboot的@Configuration、@Bean、@Import()、@ImportResource()、@Conditional说明

  • 注:ctrl + H 快捷键的意思为:显示当前类的层次结构
    14 - springboot的@Configuration、@Bean、@Import()、@ImportResource()、@Conditional说明



3、附2:配置绑定

  • 如何使用Java读取到properties文件中的内容,并且把它封装到JavaBean中,以供随时使用?这个其实在前面见过一种,就是使用@ConfigurationProperties注解,这里把几种方式都补充完整吧



3.1、使用@ConfigurationProperties


/**
 * 只有在容器中的组件,才会拥有SpringBoot提供的强大功能
 * 所以使用了@Component注解,表明当前类是一个组件
 * 简单粗暴理解:把当前类丢到Ioc容器中去
 */
@Component
@ConfigurationProperties(prefix = "car")    // 这个car就是properties中配置的car对象的键值对,如:car.brand=BYD
// 这样car需要的属性会和properties中的自动对应
public class Car {

    private String brand;
    private Integer price;

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Car{" +
                "brand='" + brand + '\'' +
                ", price=" + price +
                '}';
    }
}




3.2、@EnableConfigurationProperties

  • 这种方式:适合导入第三方配置,假如:第三方的配置没有用自动装配的相关注解,即:没有丢到Ioc容器中去,那么我们我想要在某个地方用的时候就无法引用进来,因此:可以使用这个注解
  • 这个注解有两个作用:注 这个注解必须放在配置类中,即:使用@Configuration
  • 1、开启属性配置绑定功能( 如:例子中的绑定Car类的属性 )
  • 2、把组件自动注册到容器中( 如:例子中的Car,用了这个注解就可以把Car丢到Ioc容器中去 )

@EnableConfigurationProperties(Car.class)
public class MyConfig {
}




4、附4、@Configuration、@Bean、@Component、@Controller、@Service、@Repository几个注解的关系

14 - springboot的@Configuration、@Bean、@Import()、@ImportResource()、@Conditional说明

相关文章: