Springboot-注册注解【springboot常用注解】

1.组件注册

1.1 使用的注解

  • @Configuration:普通配置类,替代以前的配置文件,配置类本身也是容器的组件|
  • @SpringBootConfiguration:Springboot配置类,与@Configuration功能一样|
  • @Bean:替代以前的Bean标签,如果没有在Bean标签内定义名字,则默认组件的名字为方法名,可以直接修改注解的名字|
  • @Scope:多实例获取
  • @Import:导入第三方组件

1.2 步骤

1、@Configuration 编写一个配置类

2、在配置类中,自定义方法给容器中注册组件。配合@Bean

3、或使用@Import 导入第三方的组件

1.3 实战

第一步:创建一个组件,比如我创建的是一个Cat实体类

java 复制代码
public class Cat {
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

第二步:创建一个配置类,并且注册相应的组件,我创建的类名为ApplConfig

java 复制代码
@Import(DruidRuntimeException.class) //第三方类,也可以通过Import导入,给容器中放指定类型的组件,组件的名字默认是全类名
@SpringBootConfiguration // 定义配置文件
public class AppConfig {
    @Scope
    @Bean("user01")
    public User user(){
        var user=new User();
        user.setName("张三");
        user.setId(1L);
        return user;
    }

    //2.给第三方类注册组件
    @Bean
    public FastsqlException fastsqlException(){
        return new FastsqlException();
    }

}

第三步: 查看是否注册成功,在主程序中,查看容器中是否有这些组件

java 复制代码
@SpringBootApplication// 告诉系统这是一个Springboot的应用
public class Boot2DemoApplication {

    public static void main(String[] args) {
        // java10:局部变量类型的自动推断
        var ioc = SpringApplication.run(Boot2DemoApplication.class, args);

        for (String s : ioc.getBeanNamesForType(User.class)) {
            System.out.println(s);
        }

        // 查看第三方库是否注册成功
        for (String s : ioc.getBeanNamesForType(FastsqlException.class)) {
            System.out.println(s);
        }

        for (String s :ioc.getBeanNamesForType(DruidRuntimeException.class)) {
            System.out.println(s);
        }
        
    }

}

2. 条件注解

2.1 使用的注解

@ConditionalOnXxx

  • @ConditionalOnClass:如果类路径中存在这个类,则触发指定行为
  • @ConditionalOnMissingClass:如果类路径中不存在这个类,则触发指定行为
  • @ConditionalOnBean:如果容器中存在这个Bean(组件),则触发指定行为
  • @ConditionalOnMissingBean:如果容器中不存在这个Bean(组件),则触发指定行为
  • @ConditionalOnBean(value=组件类型,name=组件名字):判断容器中是否有这个类型的组件,并且名字是指定的值

2.2 实战

复制代码
场景:
● 如果存在FastsqlException这个类,给容器中放一个Cat组件,名cat01,
● 否则,就给容器中放一个Dog组件,名dog01
● 如果系统中有dog01这个组件,就给容器中放一个 User组件,名zhangsan 
● 否则,就放一个User,名叫lisi

代码:

java 复制代码
@ConditionalOnClass(value = "com.alibaba.druid.FastsqlException") //放在类级别,如果注解判断生效,则整个配置类才会生效
@SpringBootConfiguration
public class AppConfig2 {
    @ConditionalOnClass(FastsqlException.class) // 如果类路径中存在这个类,则触发指定行为
    @Bean
    public Cat cat01(){
        return new Cat();
    }

    @ConditionalOnMissingClass(value="com.alibaba.druid.FastsqlException")// 如果类路径中不存在这个类,则触发指定行为
    @Bean
    public Dog dog01(){
        return new Dog();
    }

    @ConditionalOnBean(value = Dog.class) // 在有这个组件类的情况指定行为
    @Bean
    public User zhangsan(){
        return  new User();
    }

    @ConditionalOnMissingBean(value = Dog.class)// 在没有这个组件类的情况指定行为
    @Bean
    public User lisi(){
        return new User();
    }
}

验证是否按照指定条件注册的组件:在主程序中运行下面代码

java 复制代码
@SpringBootApplication// 告诉系统这是一个Springboot的应用
public class Boot2DemoApplication {

    public static void main(String[] args) {
        // java10:局部变量类型的自动推断
        var ioc = SpringApplication.run(Boot2DemoApplication.class, args);
        
        // 查看一下容器中cat类的组件有哪些
        for (String s : ioc.getBeanNamesForType(Cat.class)) {
            System.out.println(s);
        }

        for (String s : ioc.getBeanNamesForType(Dog.class)) {
            System.out.println(s);
        }

        for (String s : ioc.getBeanNamesForType(User.class)) {
            System.out.println(s);
        }
    }
}

3.属性绑定

3.1 使用的注解

  • @ConfigurationProperties: 声明组件的属性和配置文件哪些前缀开始项进行绑定
  • @EnableConfigurationProperties:快速注册注解:

3.2 步骤

将容器中任意组件(Bean)的属性值和配置文件的配置项的值进行绑定

  • 1、给容器中注册组件(@Component、@Bean)

  • 2、使用@ConfigurationProperties 声明组件和配置文件的哪些配置项进行绑定

  • 或者使用@EnableConfigurationProperties注解

    场景:SpringBoot默认只扫描自己主程序所在的包。如果导入第三方包,即使组件上标注了
    @Component、@ConfigurationProperties 注解,也没用。
    因为组件都扫描不进来,此时使用这个注解就可以快速进行属性绑定并把组件注册进容器

3.2 实战

使用@ConfigurationProperties注解

第一步:注册组件

创建一个pig组件

java 复制代码
@ConfigurationProperties(prefix ="pig")
@Component
public class Pig {
    private Long id;
    private String name;
    private Integer age;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Pig{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

第二步:在配置文件properties中写好对应的配置

java 复制代码
pig.id=1
pig.name=佩奇
pig.age=5

第三步:测试一下属性是否绑定成功

java 复制代码
@SpringBootApplication// 告诉系统这是一个Springboot的应用
public class Boot2DemoApplication {

    public static void main(String[] args) {
        // java10:局部变量类型的自动推断
        var ioc = SpringApplication.run(Boot2DemoApplication.class, args);

        Pig pig=ioc.getBean(Pig.class);
        System.out.println("pig"+pig);

    }

}


方式二

也可以将组件类名上方的@component取消掉,直接在配置类中注册组件也是可以的

java 复制代码
@SpringBootConfiguration
public class AppConfig2 {
    @Bean
    public Pig pig(){
        return new Pig();
    }
}

方法三

也可以将prefix也放到配置文件中

java 复制代码
@SpringBootConfiguration
public class AppConfig2 {
    @Bean
    @ConfigurationProperties(prefix ="pig")
    public Pig pig(){
        return new Pig();
    }
}
使用@EnableConfigurationProperties注解

第一步:先在bean中创建一个sheep组件,并且加上@ConfigurationProperties注解,绑定属性

@ConfigurationProperties(prefix = "sheep")

public class Sheep {

private Long id;

private String name;

private Integer age;

复制代码
public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Integer getAge() {
    return age;
}

public void setAge(Integer age) {
    this.age = age;
}

@Override
public String toString() {
    return "Sheep{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", age=" + age +
            '}';
}

}

复制代码
第二步:在配置文件`properties`中写好对应的配置
~~~ java
pig.id=1
pig.name=哈利
pig.age=5

第三步:在配置类中配置

java 复制代码
/*
@EnableConfigurationProperties有两个功能
1.开启sheep的属性绑定
2.默认会直接把这个组件放到容器中
*/
@EnableConfigurationProperties(Sheep.class)
@SpringBootApplication
public class AppConfig3 {

}

使用@EnableConfigurationProperties会把属性与组件绑定,并且还会自动将组件放到容器中./一般用于第三方写好的组件进行属性绑定,springboot默认只扫描主程序所在的包.

相关推荐
拾光师7 分钟前
Hadoop安全模式详解
后端
gAlAxy...8 分钟前
面试JAVASE基础(五)——Java 集合体系
java·python·面试·1024程序员节
ceclar12313 分钟前
C++容器list
java·c++·list
张较瘦_22 分钟前
[论文阅读] 从 5MB 到 1.6GB 数据:Java/Scala/Python 在 Spark 中的性能表现全解析
java·python·scala
阿杰AJie23 分钟前
数据库id生成方案
后端·mysql
Han.miracle38 分钟前
数据库圣经-----最终章JDBC
java·数据库·学习·maven·database
摇滚侠42 分钟前
Spring Boot3零基础教程,生命周期启动加载机制,笔记64
spring boot·笔记
摇滚侠1 小时前
Spring Boot3零基础教程,整合 Redis,笔记69
spring boot·redis·笔记
仪器工程师1 小时前
报错提示 “unclosed parenthesis”“mismatched quotes” 的解决办法
后端
yangwan1 小时前
Ubunut 22.04 安装 Docker 24.0.x
前端·后端