SpringBoot底层注解

这篇具有很好参考价值的文章主要介绍了SpringBoot底层注解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

本文主要讲诉@Configuration、@Import、@Conditional、@ImportResource、@ConfigurationProperties注解。

先将实体类给大家,方便下面测试:
get、set、构造器大家自己添加,这里我用的是ToString等注解(以后会出文章讲诉)所以没写这些,就不列出来了。

public class Pet {
    private String name;

}
=================================
public class User {
    private String name;
    private Integer age;
    private Pet pet;
}
============================
public class Car {
    private String brand;
    private String price;
}

一、@Configuration

1、配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的,所谓单实例跟我们在Spring中了解的bean创建对象的单实例是一样的,就是在调用getBean方法创建相同类型实例对象时,这些对象的地址相同(即无论创建多少对象,都是同一个对象)。多实例就是每次创建对象都重新创建一个不同地址的新对象。
2、配置类本身也是组件。
3、proxyBeanMethods:代理bean的方法。
Full模式(proxyBeanMethods = true)(保证每个@Bean方法被调用多少次返回的组件都是单实例的)(默认)
Lite模式(proxyBeanMethods = false)(每个@Bean方法被调用多少次返回的组件都是新创建的)

配置类:

@Configuration(proxyBeanMethods = true) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {

    /**
     * Full:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
     * @return
     */
    @Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
    public User user01(){
        User zhangsan = new User("zhangsan", 18,tomcatPet());
        //user组件依赖了Pet组件
        return zhangsan;
    }

    @Bean("tom")
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }
}

SpingBoot启动类

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.dragon.boot")
public class MainApplication {

    public static void main(String[] args) {
    //1、返回我们IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);

    //2、查看容器里面的组件
    //    String[] names = run.getBeanDefinitionNames();
    //    for (String name : names) {
    //        System.out.println(name);
    //    }

    //3、从容器中获取组件
        Pet tom01 = run.getBean("tom", Pet.class);
        Pet tom02 = run.getBean("tom", Pet.class);
        System.out.println("组件:"+(tom01 == tom02));

    //4、com.atguigu.boot.config.MyConfig$$EnhancerBySpringCGLIB$$51f1e1ca@1654a892
        MyConfig bean = run.getBean(MyConfig.class);
        System.out.println(bean);

    //如果@Configuration(proxyBeanMethods = true)代理对象调用方法。SpringBoot总会检查这个组件是否在容器中有。
        //保持组件单实例
        User user = bean.user01();
        User user1 = bean.user01();
        System.out.println(user == user1);

        User user01 = run.getBean("user01", User.class);
        Pet tom = run.getBean("tom", Pet.class);

        System.out.println("用户的宠物:"+(user01.getPet() == tom));
    }
}

SpringBoot底层注解,SpringBoot,spring boot,java,后端,spring
看运行结果分析:

  • 组件:true
    配置类中我用的Full模式:@Configuration(proxyBeanMethods = true) ,当然就是单实例模式,所有创建的对象都是同一个对象。
  • com.dragon.boot.config.MyConfig$ $ SpringCGLIB$$0@283e8358
    这个输出是我getBean获取的配置类组件,可以看出配置类本身也是组件。
  • 用户的宠物:true
    当我开启单实例模式时,就能够处理依赖关系,这里我创建的组件宠物==用户组件里的宠物,User zhangsan = new User("zhangsan", 18,tomcatPet());。我创建的用户组件时就是调用的tomcatPet(),因为是单实例模式,所以我在创建用户调用创建的宠物和直接创建的宠物都是同一个对象。

启动类中我写了个查看容器里面的组件的方法,注释掉了,可以运行,在控制台Ctrl+F搜索查看注册的组件。
将proxyBeanMethods 属性改成false,运行结果就变成了false。

总结:

  • 配置 类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
  • 配置 类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式(默认)

二、@Import导入组件

@Bean、@Component、@Controller、@Service、@Repository,它们是Spring的基本标签,在Spring Boot中并未改变它们原来的功能。
@ComponentScan在Spring学习中大家一定接触了吧,就是开启组件扫描。
Import({User.class、DBHelper.class})会给容器中自动创建出User、DBHelper组件,默认组件的名字就是全类名。如果创建多个组件就在在大号内添加,用逗号隔开。

@Import({User.class,DBHelper.class})
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {
	//....
}

启动类:

//1、返回我们IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);

//...

//5、获取组件
String[] beanNamesForType = run.getBeanNamesForType(User.class);

for (String s : beanNamesForType) {
    System.out.println(s);
}

三、@Conditional条件装配

条件装配:满足Conditional指定的条件,则进行组件注入

SpringBoot底层注解,SpringBoot,spring boot,java,后端,spring

这里用@ConditionalOnMissingBean举例说明:

  • @ConditionalOnMissingBean(name = “tt”)
    用在类上:没有tt名字的Bean时才会将类里所有配置注册成组件
    用在方法上:没有tt名字的Bean时才会将改方法注册成组件
@Configuration(proxyBeanMethods = true) //告诉SpringBoot这是一个配置类 == 配置文件
@Import({User.class})
@ConditionalOnMissingBean(name = "tom")
public class MyConfig {
    /**
     * Full:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
     * @return
     */
    @Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
    public User user01(){
        User zhangsan = new User("zhangsan", 18,tomcatPet());
        //user组件依赖了Pet组件
        return zhangsan;
    }

    @Bean("tom")
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }
}

启动类:

ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);

    //2、查看容器里面的组件
    String[] names = run.getBeanDefinitionNames();
    for (String name : names) {
        System.out.println(name);
    }

    boolean tom = run.containsBean("tom");//是否包含某个组件
    System.out.println("容器中Tom组件:"+tom);//false

    boolean user01 = run.containsBean("user01");
    System.out.println("容器中user01组件:"+user01);//true

    boolean tom22 = run.containsBean("tom22");
    System.out.println("容器中tom22组件:"+tom22);//true

四、@ImportResource导入Spring配置文件

公司项目使用bean.xml文件生成配置bean,然而你为了省事,想继续复用bean.xml,@ImportResource粉墨登场。

bean.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="haha" class="com.dragon.boot.bean.User">
        <property name="name" value="zhangsan"></property>
        <property name="age" value="18"></property>
    </bean>

    <bean id="hehe" class="com.atguigu.boot.bean.Pet">
        <property name="name" value="tomcat"></property>
    </bean>
</beans>

复用方法:

@ImportResource("classpath:bean.xml")
public class MyConfig {
	//...
}

启动类测试:

//1、返回我们IOC容器
    ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);

	boolean haha = run.containsBean("haha");
	boolean hehe = run.containsBean("hehe");
	System.out.println("haha:"+haha);//true
	System.out.println("hehe:"+hehe);//true

返回true,说明注册成了组件。

五、@ConfigurationProperties配置绑定

使用Java读取到properties文件中的内容,并且把它封装到JavaBean中

传统方法:

public class getProperties {
     public static void main(String[] args) throws FileNotFoundException, IOException {
         Properties pps = new Properties();
         pps.load(new FileInputStream("a.properties"));
         Enumeration enum1 = pps.propertyNames();//得到配置文件的名字
         while(enum1.hasMoreElements()) {
             String strKey = (String) enum1.nextElement();
             String strValue = pps.getProperty(strKey);
             System.out.println(strKey + "=" + strValue);
             //封装到JavaBean。
         }
     }
 }

SpringBoot的两种方法:

  • @ConfigurationProperties + @Component
    假设有配置文件application.properties
mycar.brand=BYD
mycar.price=100000

只有在容器中的组件,才会拥有SpringBoot提供的强大功能,所以Bean对象类注册成组件
下面的prefix是指属性前缀

@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {
...
}
  • @EnableConfigurationProperties + @ConfigurationProperties
    1.开启Car配置绑定功能
    2.把这个Car这个组件自动注册到容器中

配置类:

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

Car类:

@ConfigurationProperties(prefix = "mycar")
public class Car {
 //...
}

HelloController类:

@RestController
public class HelloController {
    @Autowired
    Car car;
    @RequestMapping("/car")
    public Car car(){
        return car;
    }
    @RequestMapping("/hello")
    public String handle01(){
        return "Hello,Spring Boot 2!"+"你好";
    }
}

这里我写了个控制层,运行结果如下:
SpringBoot底层注解,SpringBoot,spring boot,java,后端,spring
可以看出确实将properties文件内的内容封装了。


总结

以上就是SpringBoot的一些底层注解的讲解。文章来源地址https://www.toymoban.com/news/detail-706799.html

到了这里,关于SpringBoot底层注解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot + Vue前后端分离项目实战 || 二:Spring Boot后端与数据库连接

    系列文章: SpringBoot + Vue前后端分离项目实战 || 一:Vue前端设计 SpringBoot + Vue前后端分离项目实战 || 二:Spring Boot后端与数据库连接 SpringBoot + Vue前后端分离项目实战 || 三:Spring Boot后端与Vue前端连接 SpringBoot + Vue前后端分离项目实战 || 四:用户管理功能实现 SpringBoot + Vue前后

    2024年02月11日
    浏览(50)
  • 微信小程序的授权登录-Java 后端 (Spring boot)

    微信开发文档链接:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 一个可以测试的微信小程序 此微信小程序的APPID和APPscret(至开发者后台获取) 从时序图我们可以了解到流程大致分为两步: 小程序端获取code后传给Java后台 Java后台获取code后向微信后台接口

    2024年02月09日
    浏览(38)
  • “从零开始学习Spring Boot:快速搭建Java后端开发环境“

    标题:从零开始学习Spring Boot:快速搭建Java后端开发环境 摘要:本文将介绍如何从零开始学习Spring Boot,并详细讲解如何快速搭建Java后端开发环境。通过本文的指导,您将能够快速搭建一个基于Spring Boot的Java后端开发环境并开始编写代码。 正文: 一、准备工作 在开始之前,

    2024年02月15日
    浏览(41)
  • SpringBoot底层注解

    本文主要讲诉@Configuration、@Import、@Conditional、@ImportResource、@ConfigurationProperties注解。 先将实体类给大家,方便下面测试: get、set、构造器大家自己添加,这里我用的是ToString等注解(以后会出文章讲诉)所以没写这些,就不列出来了。 1、配置类里面使用@Bean标注在方法上给

    2024年02月09日
    浏览(20)
  • Spring(18) @Order注解介绍、使用、底层原理

    @Order :是 spring-core 包下的一个注解。@Order 作用是 定义 Spring IOC 容器中 Bean 的执行顺序 。 注意: Spring 的 @Order 注解或者 Ordered 接口,不决定 Bean 的加载顺序和实例化顺序,只决定 Bean 注入到 List 中的顺序。 @Order 注解接受一个整数值作为参数, 数值越小表示优先级越高 。

    2024年02月20日
    浏览(26)
  • Spring boot注解讲解

    人不走空                                                                            目录         🌈个人主页:人不走空       💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨   注解 注解列表如下 JPA注解 作者其他作品:   @SpringBootApplication :申

    2024年02月19日
    浏览(34)
  • Spring Boot常用注解

    在 Spring Boot 中,有许多注解用于简化和标识应用程序的不同方面。以下是一些常用的 Spring Boot 注解: @SpringBootApplication : 用于标识主应用程序类。通常与 @EnableAutoConfiguration 、 @ComponentScan 和 @Configuration 一起使用,它是一个复合注解,用于简化配置。 @Controller : 用于标识控

    2024年01月19日
    浏览(31)
  • Spring boot 常见注解

    Spring Boot是一个基于Spring框架的快速开发框架,它通过自动化配置和约定优于配置的原则,简化了Spring应用程序的开发过程。Spring Boot可以帮助开发者快速构建独立的、生产级别的应用程序,并且可以与其他Spring框架和第三方库无缝集成。 Spring Boot提供了很多便利的特性,比如

    2024年01月18日
    浏览(32)
  • 2023 最新版IntelliJ IDEA 2023.1创建Java Web前(vue3)后端(spring-boot3)分离 项目详细步骤(图文详解)

    2023 最新版IntelliJ IDEA 2023.1创建Java Web 项目详细步骤(图文详解) 本篇使用当前Java Web开发主流的spring-boot3框架来创建一个Java前后端分离的项目,前端使用的也是目前前端主流的vue3进行一个简单的项目搭建,让你距离Java全栈开发更近一步 🏴‍☠️。 使用版本: “17.0.1”

    2024年02月12日
    浏览(76)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包