SpringBoot底层注解超详细介绍

 更新时间:2022年09月30日 15:42:05   作者:刘婉晴  
这篇文章主要介绍了SpringBoot底层注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

1. @Configuration

—— 放在类前注释 用于表示配置类,配置类也是一个组件

@Configuration(proxyBeanMethods = true) // 配置类 == 配置文件
public class MyConfig {
}

通过 proxyBeanMethods 很好的解决了组件依赖的问题 ——

  • 只是注册组件,组件间无依赖(false)
  • 有组件依赖(true)

测试组件依赖及测试类本身是组件

		// 配置类本身也是一个组件
        MyConfig bean = run.getBean(MyConfig.class);
        System.out.println(bean);
        run.getBean("user01", User.class);
        run.getBean("tom", Pet.class);
        System.out.println("用户的宠物是不是容器中的宠物" + (user01.getPet() == tom01));

2. @bean

—— 放在方法前表示给容器中注册组件 (单实例)

注:目前我对容器、组件的理解有限, 后期如果有更深入的理解,会更新此处

    @Bean // 给容器中添加组件,方法名作为组件id, 返回类型是组件类型 , 返回的值是组件在容器中的实例
    public User user01(){
        User zangsan = new User("zangsan", 18);
        zangsan.setPet(tomcatPet());
        return zangsan;
    }

测试是否注册成功

		ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
        // 查看容器里的组件
        String[] names = run.getBeanDefinitionNames();
        for(String s: names){
            System.out.println(s);
        }

3. @Import

—— 放在配置类前,用于导入组件

@Import({User.class, DBHelper.class}) // 给容器中自动创建出这两个类型的组件
@Configuration // 配置类 == 配置文件
public class MyConfig {
}

测试导入组件是否成功

DBHelper bean1 = run.getBean(DBHelper.class);

4. @Conditional条件装配

—— 用于注册组件需要特定条件的情况

例如: 用户需要宠物,若无宠物tom组件,不能注册用户组件

    @ConditionalOnBean(name = "tom") // 表示有 tom 组件才能注册 user01 组件
    @Bean // 给容器中添加组件,方法名作为组件id, 返回类型是组件类型 , 返回的值是组件在容器中的实例
    public User user01(){
        User zangsan = new User("zangsan", 18);
        zangsan.setPet(tomcatPet());
        return zangsan;
    }

测试

        System.out.println("容器中是否含有宠物组件" + run.containsBean("tom"));
        System.out.println("容器中是否含有用户组件" + run.containsBean("user01"));

5. 配置绑定

绑定核心配置文件 (application.properities)

方法一:

@Component // 将组件加到容器中
@ConfigurationProperties(prefix = "mycar") // 配置属性名

方法二:

// 功能一:开启Car的属性配置
// 功能二:把指定的组件导入容器中
@EnableConfigurationProperties(Car.class)

测试类:

    @Autowired
    Car car;
    @RequestMapping("/car")
    public  Car car(){
        System.out.println(car);
        return  car;
    }

SpringBoot自动配置原理(源码分析)

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration  // 当前是一个配置类
@EnableAutoConfiguration  
@ComponentScan( // 指定扫描那些Spring注解
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)

@EnableAutoConfiguration

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage //——@Import({AutoConfigurationPackages.Registrar.class})
@Import({AutoConfigurationImportSelector.class})

核心注解1:

@AutoConfigurationPackage 利用Registrar给容器中批量注册组件

—— 将指定包下的组件批量导入 (MainAppliaction 包下)

核心注解2

@Import({AutoConfigurationImportSelector.class})

—— 利用 getAutoConfigurationEntry() 方法给容器中批量导入组件

配置类位置

总结: SpringBoot 所有自动配置全部加载, 按照条件装配 —— 导入相关场景才能生效

  • springboot 加载所有自动配置类, 按条件生效 —— 生效的配置类为容器中装配组件(默认绑定配置文件中的值)
  • 用户有自己配置的组件, 以用户的为先
  • 定制化配置 —— 自己替换底层组件 / 修改底层组件配置文件中的值

到此这篇关于SpringBoot底层注解超详细介绍的文章就介绍到这了,更多相关SpringBoot底层注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot整合Lombok插件与使用详解

    SpringBoot整合Lombok插件与使用详解

    Lombok是Java开发的插件,通过注解自动生成常用代码,如getter/setter,节省开发时间,提高效率,它在编译期生成方法,不影响性能,安装Lombok需要添加Maven依赖和IDEA插件,使用注解如@Data、@Getter等简化代码编写,官网提供详细文档
    2024-09-09
  • java jdk1.8 使用stream流进行list 分组归类操作

    java jdk1.8 使用stream流进行list 分组归类操作

    这篇文章主要介绍了java jdk1.8 使用stream流进行list 分组归类操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • logback如何自定义日志存储

    logback如何自定义日志存储

    这篇文章主要介绍了logback如何自定义日志存储的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 简单说说JVM堆区的相关知识

    简单说说JVM堆区的相关知识

    今天给大家带来的是关于Java虚拟机的相关知识,文章围绕着JVM堆区展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Java之Spring AOP 实现用户权限验证

    Java之Spring AOP 实现用户权限验证

    本篇文章主要介绍了Java之Spring AOP 实现用户权限验证,用户登录、权限管理这些是必不可少的业务逻辑,具有一定的参考价值,有兴趣的可以了解一下。
    2017-02-02
  • Java中HashTable和HashMap的区别_动力节点Java学院整理

    Java中HashTable和HashMap的区别_动力节点Java学院整理

    HashTable和HashMap主要的区别有:线程安全性,同步(synchronization),以及速度。接下来通过本文给大家简单介绍下HashTable和HashMap的区别,需要的的朋友参考下吧
    2017-04-04
  • Java中MyBatis的动态语句详解

    Java中MyBatis的动态语句详解

    这篇文章主要介绍了Java中MyBatis的动态语句详解,动态 SQL 是 MyBatis 的强大特性之一,通过不同参数生成不同的 SQL,可以动态地对数据持久层进行操作,而不需要每个数据访问操作都要进行手动地拼接 SQL 语句,需要的朋友可以参考下
    2023-08-08
  • java开发之闹钟的实现代码

    java开发之闹钟的实现代码

    本篇文章介绍了,在java中闹钟的实现代码。需要的朋友参考下
    2013-05-05
  • Mybatis中一条SQL使用两个foreach的问题及解决

    Mybatis中一条SQL使用两个foreach的问题及解决

    这篇文章主要介绍了Mybatis中一条SQL使用两个foreach的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java中字符串转int数据类型的三种方式

    Java中字符串转int数据类型的三种方式

    这篇文章主要介绍了Java中字符串转int数据类型的三种方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03

最新评论