学习SpringBoot容器功能及注解原理

目录
  • 1.组件添加
    • 1.1@Configuration
    • 1.2@Import
    • 1.3@Conditional
  • 2.原生配置文件引入
    • 2.1@ImportResource
  • 3.配置绑定
    • 3.1@ConfigurationProperties
    • 3.2@EnableConfigurationProperties + @ConfigurationProperties

1.组件添加

1.1@Configuration

@Configuration:告诉SpringBoot这是一个配置类

配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的

配置类本身也是组件

proxyBeanMethods:代理bean的方法

  • Full(proxyBeanMethods = true):保证每个@Bean方法被调用多少次返回的组件都是单实例的
  • Lite(proxyBeanMethods = false):每个@Bean方法被调用多少次返回的组件都是新创建的
  • 组件依赖必须使用Full模式默认。其他默认是否Lite模式

最佳实战:

1.配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断

2.配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式

代码实战演示:

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

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

    @Bean("tom")//也可以自己设置id代替方法名作为id
    public Pet tomcatPet() {
        return new Pet("tomcat");
    }

}
@SpringBootApplication
public class Boot01HelloworldApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(Boot01HelloworldApplication.class, args);
        MyConfig bean = run.getBean(MyConfig.class);
        System.out.println(bean);//com.atguigu.boot.config.MyConfig@d67d8
        //如果@Configuration(proxyBeanMethods = true)代理对象调用方法。SpringBoot总会检查这个组件是否在容器中有。
        //保持组件单实例
        User user = bean.user01();
        User user1 = bean.user01();
        //(proxyBeanMethods = true)返回true
        //(proxyBeanMethods = false)返回false
        System.out.println(user == user1);
    }

}

如果有组件依赖:

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

    @Bean//给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
    public User user01() {
        User zhangsan = new User("zhangsan", 18);
        //user组件依赖了Pet组件
        zhangsan.setPet(tomcatPet());
        return zhangsan;
    }
    @Bean("tom")//也可以自己设置id代替方法名作为id
    public Pet tomcatPet() {
        return new Pet("tomcat");
    }

}
@SpringBootApplication
public class Boot01HelloworldApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(Boot01HelloworldApplication.class, args);
        MyConfig bean = run.getBean(MyConfig.class);
        System.out.println(bean);
        User user01 = run.getBean("user01", User.class);
        Pet tom = run.getBean("tom", Pet.class);
		//(proxyBeanMethods = true)返回(用户的宠物:true)
        //(proxyBeanMethods = false)返回(用户的宠物:false)
        System.out.println("用户的宠物:"+(user01.getPet() == tom));
    }

}

1.2@Import

@Import:给容器中导入组件

代码演示:

//给容器中自动无参构造创建出这两个类型的组件、默认组件的名字就是全类名
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {
}
@SpringBootApplication
public class Boot01HelloworldApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(Boot01HelloworldApplication.class, args);
        //获取组件
        String[] beanNamesForType = run.getBeanNamesForType(User.class);
        for (String s : beanNamesForType) {
            System.out.println(s);
        }
        DBHelper bean = run.getBean(DBHelper.class);
        System.out.println(bean);
    }
}

//输出:
com.atguigu.boot.bean.User
ch.qos.logback.core.db.DBHelper@16ef799

1.3@Conditional

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

有一系列派生注解:

2.原生配置文件引入

2.1@ImportResource

原生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.atguigu.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>

自定义配置类:

@Configuration(proxyBeanMethods = true)//告诉SpringBoot这是一个配置类=配置文件
@ImportResource("classpath:beans.xml")
public class MyConfig {
}

测试:

@SpringBootApplication
public class Boot01HelloworldApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(Boot01HelloworldApplication.class, args);

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

3.配置绑定

如何使用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。
         }
     }
 }

3.1@ConfigurationProperties

配置文件:

mycar.brand=BYD
mycar.price=100000

创建一个car类:

//只有在容器中的组件,才会拥有SpringBoot提供的强大功能
@Component
@ConfigurationProperties(prefix = "mycar")
//Lombok注解简化开发
@Data
@NoArgsConstructor
@ToString
@AllArgsConstructor
public class Car {
    private String brand;
    private Integer price;
}

测试方法:

@RestController
public class HelloController {
    @Autowired
    Car car;
    @RequestMapping("/car")
    public Car car(){
        return car;
    }
}

测试结果:

3.2@EnableConfigurationProperties + @ConfigurationProperties

@EnableConfigurationProperties必须在配置类里写:

@Configuration(proxyBeanMethods = true)//告诉SpringBoot这是一个配置类=配置文件
@EnableConfigurationProperties(Car.class)
//1.开启Car属性配置绑定功能
//2.把Car这个组件自动注册到容器中
public class MyConfig {
}

该写法就不用在写@Component

@ConfigurationProperties(prefix = "mycar")
@Data
@NoArgsConstructor
@ToString
@AllArgsConstructor
public class Car {
    private String brand;
    private Integer price;
}

以上就是学习SpringBoot容器功能及注解原理的详细内容,更多关于SpringBoot容器功能及注解的资料请关注我们其它相关文章!

(0)

相关推荐

  • 浅谈springBoot注解大全

    一.注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan.@Configuration和@EnableAutoConfiguration注解.其中@ComponentScan让spring Boot扫描到Configuration类并把它加入到程序上下文. @Configuration 等同于spring的XML配置文件:使用Java代码可以检查类型安全. @EnableAutoConfiguration 自动配置. @Compon

  • spring boot基于Java的容器配置讲解

    spring容器是负责实例化.配置.组装组件的容器. 容器的配置有很多,常用的是xml.Java注解和Java代码. 在spring中Ioc容器相关部分是context和beans中.其中context-support保存着许多线程的容器实现.比如AnnotationConfigApplicationContext或者ClassPathXmlApplicationContext.两者只有接收的目标不同,前者接收Java类后者接收Xml文件.但作为spring容器的不同实现殊途同归. 下面我通过s

  • SpringBoot注解梳理(小结)

    一.注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan.@Configuration和@EnableAutoConfiguration注解.其中@ComponentScan让spring Boot扫描到Configuration类并把它加入到程序上下文. @Configuration 等同于spring的XML配置文件:使用Java代码可以检查类型安全. @EnableAutoConfiguration 自动配置. @Compon

  • 详解如何实现SpringBoot的底层注解

    一.@Configuration注解 1.基本使用 自定义配置类 /** * 1.@Configuration 告诉SpringBoot这是一个配置类,相当于一个xml配置文件 * * 2.配置类里面使用 @Bean 标注在方法上 来给容器注册组件,默认是单实例的 * * 3.配置类本身也是一个组件 */ @Configuration(proxyBeanMethods = true) public class MyConfig { @Bean public User user01(){ retu

  • springboot常用注释的讲解

    1:@Qualifier @Qualifier 注释指定注入 Bean 的名称,这样歧义就消除了.所以@Autowired 和@Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了.例子如下: 有一个接口: public interface EmployeeService { public String getEmployeeById(Long id); } 有两个实现类: @Service("service") public class Empl

  • 详解Spring Boot最核心的27个注解,你了解多少?

    导读  Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架,它不仅可以方便地创建生产级的Spring应用程序,还能轻松地通过一些注解配置与目前比较火热的微服务框架SpringCloud集成. 而Spring Boot之所以能够轻松地实现应用的创建及与其他框架快速集成,最核心的原因就在于它极大地简化了项目的配置,最大化地实现了"约定大于配置"的原则.然而基于Spring Boot虽然极大地方便了开发,但是也很容易让人"云里雾里",特别是各种

  • 学习SpringBoot容器功能及注解原理

    目录 1.组件添加 1.1@Configuration 1.2@Import 1.3@Conditional 2.原生配置文件引入 2.1@ImportResource 3.配置绑定 3.1@ConfigurationProperties 3.2@EnableConfigurationProperties + @ConfigurationProperties 1.组件添加 1.1@Configuration @Configuration:告诉SpringBoot这是一个配置类 配置类里面使用@B

  • springboot @ComponentScan注解原理解析

    这篇文章主要介绍了springboot @ComponentScan注解原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 @ComponentScan 告诉Spring从哪里找到bean. 如果你的其他包都在@SpringBootApplication注解的启动类所在的包及其下级包,则你什么都不用做,SpringBoot会自动帮你把其他包都扫描了. 如果你有一些bean所在的包,不在启动类的包及其下级包,那么你需要手动加上@Compone

  • springboot整合mybatis-plus基于注解实现一对一(一对多)查询功能

    因为目前所用mybatis-plus版本为3.1.1,感觉是个半成品,所有在实体类上的注解只能支持单表,没有一对一和一对多关系映射,且该功能还在开发中,相信mybatis-plus开发团队在不久的将来应该会实现此功能. 由于本人开发习惯的原因,实在是太讨厌大量的xml充斥在整个项目中,尤其是表的mapper.xml,虽然有代码生成器可以生成,但是有些复杂的查询还是需要手写配置文件里的动态sql,这点比较反感(至于为什么反感,也是有多方面原因的). 不过可能是大量的java开发人员已经被虐惯了,已

  • 全面解析SpringBoot自动配置的实现原理

    之前一直在用SpringBoot框架,一直感觉SpringBoot框架自动配置的功能很强大,但是并没有明白它是怎么实现自动配置的,现在有空研究了一下,大概明白了SpringBoot框架是怎么实现自动配置的功能,我们编写一个最简单的自动配置功能,大概的总结一下. 一,配置属性类 其实就是值对象注入的方式去配置一些Spring常用的配置,我们编写一个最简单的配置对象. @ConfigurationProperties(prefix = "hello") //@Component //如果这

  • spring @Component注解原理解析

    这篇文章主要介绍了spring @Component注解原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.@controller 控制器(注入服务) 2.@service 业务(注入dao) 3.@repository dao(实现dao访问) 4.@component (把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>) 5.@Comp

  • 详解SpringBoot健康检查的实现原理

    SpringBoot自动装配的套路,直接看 spring.factories 文件,当我们使用的时候只需要引入如下依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> 然后在 org.springframework.boot.sprin

  • Java深入浅出掌握SpringBoot之MVC自动配置原理篇

    Spring Boot 为 Spring MVC 提供了自动配置,适用于大多数应用程序. 官方文档描述: 自动配置在 Spring 的默认值之上添加了以下功能: 从官方描述解析: If you want to keep Spring Boot MVC features and you want to add additionalMVC configuration (interceptors, formatters, view controllers, and other features), y

  • SpringBoot详细分析自动装配原理并实现starter

    目录 约定优于配置 自动装配 手写一个starter组件 约定优于配置 SpringBoot的预定优于配置主要体现在以下几个方面: maven的目录结构: 配置文件默认存放在resources目录下 项目编译后的文件存放在target目录下 项目默认打包成jar格式 配置文件默认为application.yml或application.yaml或application.properties 默认通过 spring.profiles.active 属性来决定运行环境时的配置文件. 自动装配 相对于

  • SpringBoot自动配置特点与原理详细分析

    目录 一.SpringBoot是什么 二.SpringBoot的特点(核心功能) 三.SpringBoot的自动配置原理 1. @SpringBootApplication 2. @SpringBootConfiguration 3. @EnableAutoConfiguration 4. @ComponentScan 四.核心原理图 五.常用的Conditional注解 一.SpringBoot是什么 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Sprin

  • SpringBoot统一功能处理实现的全过程

    目录 前言 1.用户登录权限效验 1.1 Spring AOP 实现用户统一登录验证 1.2 Spring 拦截器 1.2.1 自定义拦截器 1.2.2 将自定义拦截器加入到系统配置 1.3 拦截器实现原理 2.统一异常处理 3.统一数据返回格式 3.1 统一数据返回格式的优点 3.2 统一数据返回格式的实现 4.总结 前言 这篇文章主要介绍Spring Boot的统一功能处理模块,也是AOP的实战环节. 1.用户登录权限效验 在学习Spring AOP之前,用户登录权限的验证是由每个方法中自己

随机推荐