SpringBoot

SpringBoot 原理篇


文章目录

  • SpringBoot
  • SpringBoot 原理篇
  • 1 自动配置
  • 1.2 bean 的加载方式【二】
  • 1.2.1 第二种方式


1 自动配置

1.2 bean 的加载方式【二】
1.2.1 第二种方式

上一次我们已经回顾了一下通过xml 配置文件的形式去定义bean

spring boot 在指定bean加载之后再加载 springboot加载bean原理_spring boot

其他没啥, 就是特别繁琐【能不能简化?】 【答案是肯定的】

于是Spring 就提供了一种实用注解的方式来定义bean

就我们想把哪个类配置成受Spring 管控的bean,在类上面加注解就行了

package com.dingjiaxiong.bean;

import org.springframework.stereotype.Component;

/**
 * ClassName: Cat
 * date: 2022/10/24 10:33
 *
 * @author DingJiaxiong
 */

//这个注解就代表了<bean> 这个标签
@Component("tom")
public class Cat {
}
package com.dingjiaxiong.bean;

import org.springframework.stereotype.Service;

/**
 * ClassName: Mounse
 * date: 2022/10/24 10:33
 *
 * @author DingJiaxiong
 */

@Service("jerry")
public class Mouse {
}

但是这样又有了个新的问题,就这样写就能加载的话,那计算机上这么多类库,岂不是Spring 都要去扫一遍,这样工作量太大

为了降低Spring 的工作强度,还是要配置一下【就你告诉Spring ,去哪儿找】

applicationContext2.xml

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

    <!--  指定加载bean的位置,component  -->
    <context:component-scan base-package="com.dingjiaxiong.bean"/>

</beans>

来一个新的运行程序

package com.dingjiaxiong.app;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * ClassName: App2
 * date: 2022/10/24 10:43
 *
 * @author DingJiaxiong
 */

public class App2 {

    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext2.xml");

        String[] names = ctx.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }

    }

}

直接运行

spring boot 在指定bean加载之后再加载 springboot加载bean原理_加载_02

可以看到, 东西还有点多

但是tom、jerry 已经加载上了

这就是第二种bean 的加载方式,就是使用组件扫描 + 类上面写注解 来配置

那现在第三方的bean 怎么定义呢?总不能去改人家的源代码加注解吧

是可以做的,先来一个配置类

package com.dingjiaxiong.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

/**
 * ClassName: DbConfig
 * date: 2022/10/24 13:29
 *
 * @author DingJiaxiong
 */

@Component
public class DbConfig {

    @Bean
    public DruidDataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        return ds;
    }

}

修改一下扫描

spring boot 在指定bean加载之后再加载 springboot加载bean原理_spring_03

再次运行

spring boot 在指定bean加载之后再加载 springboot加载bean原理_spring_04

可以看到已经上来了,而且dbConfig 也上来了,这倒不奇怪

如果我换个注解

spring boot 在指定bean加载之后再加载 springboot加载bean原理_加载_05

再次运行

spring boot 在指定bean加载之后再加载 springboot加载bean原理_xml_06

好家伙,效果没变,这意味着这两个有关系,

spring boot 在指定bean加载之后再加载 springboot加载bean原理_spring_07

OK,这大致就是使用注解 + 扫描配置 去加载 bean的介绍

回顾一下

XML+注解方式声明bean

spring boot 在指定bean加载之后再加载 springboot加载bean原理_spring boot_08

使用@Component及其衍生注解@Controller 、@Service、@Repository定义bean

spring boot 在指定bean加载之后再加载 springboot加载bean原理_xml_09