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默认只扫描主程序所在的包.

相关推荐
Marst Code1 分钟前
(Django)初步使用
后端·python·django
代码之光_19808 分钟前
SpringBoot校园资料分享平台:设计与实现
java·spring boot·后端
编程老船长21 分钟前
第26章 Java操作Mongodb实现数据持久化
数据库·后端·mongodb
IT果果日记42 分钟前
DataX+Crontab实现多任务顺序定时同步
后端
科技资讯早知道1 小时前
java计算机毕设课设—坦克大战游戏
java·开发语言·游戏·毕业设计·课程设计·毕设
苹果醋32 小时前
快速玩转 Mixtral 8x7B MOE大模型!阿里云机器学习 PAI 推出最佳实践
spring boot·nginx·毕业设计·layui·课程设计
程序员大金2 小时前
基于SpringBoot+Vue+MySQL的装修公司管理系统
vue.js·spring boot·mysql
小比卡丘2 小时前
C语言进阶版第17课—自定义类型:联合和枚举
android·java·c语言
xmh-sxh-13142 小时前
java 数据存储方式
java
liu_chunhai2 小时前
设计模式(3)builder
java·开发语言·设计模式