你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

spring boot框架知识点整理(一)

2021/12/31 10:23:02

1.springboot的特点

1.1 依赖管理

  1. 配置文件里见到很多 spring-boot-starter-*: *就某种场景
  2. 只要引入starter,这个场景的所有常规需要的依赖都会自动引入

官方地址:

https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter

  1. 见到 *-spring-boot-starter: 就是第三方为提供的简化开发的场景启动器。
  2. 默认版本号查看方式:pom配置点击—>spring-boot-starter-parent —> spring-boot-dependencies
  3. 修改默认的版本依赖
<properties>
        <mysql.version>5.1.43</mysql.version>
    </properties>

1.2 自动装配

  1. 自动配好了tomcat依赖:
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <version>2.3.4.RELEASE</version>
      <scope>compile</scope>
</dependency>
  1. 自动配好SpringMVC常用功能;
  2. 自动配好了web常见的功能:如字符串编码的问题。
  3. 无需包扫描配置:主程序所在包及其下面的所有子包都会被扫描进来。想要改变扫描路径
    ■ @SpringBootApplication(scanBasePackages=“com.test”)
    ■ 或者@ComponentScan 指定扫描路径
  4. 按需加载自动配置项: 根据需求引入spring-boot-starter-*,自动开启相关配置

2.容器功能

2.1、组件功能

1、@Configuration+@Bean
基本使用:

/**
 * 1、配置类里面使用@Bean标注在方法上给容器注册组件,默认是单实例的
 * 2、配置类本身也是组件
 * 3、proxyBeanMethods:代理bean的方法
 *      Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
 *      Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
 *      组件依赖必须使用Full模式默认。其他默认是否Lite模式
 */
@Configuration(proxyBeanMethods = false)
public class BootConfig {

    @Bean("beanColor")//给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
    public Color beanColor(){
        return new Color("李沁","迪丽热巴");
    }

    @Bean
    public Red beanRed(){
        return new Red();
    }
}

2、@Import
2.1. @Import的基本使用

import com.example.springboottest.entity.Color;
import com.example.springboottest.entity.Red;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Import({Color.class,Red.class})
@Configuration(proxyBeanMethods = false)
public class BootConfig {
}

2.2. @Import+ 接口ImportSelector 的使用

//配置类加注解
@Import({MyImportSelector.class})
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

//自定义批量注入Bean组件
public class MyImportSelector implements ImportSelector {

    //返回值,就是导入到容器中的组件全类名
    //AnnotationMetadata:当前注解@Import注解类的所有注解信息
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        //返回null会报错
        return new String[]{"com.example.springboottest.entity.Color","com.example.springboottest.entity.Red"};
    }
}

2.3. @Import+ 接口ImportSelector 的使用

import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

public class MyImportBeanDef implements ImportBeanDefinitionRegistrar{
    /**
     *
     * @param annotationMetadata:当前类的注解信息
     * @param registry:BeanDefinition注册类
     * 把所有需要添加到容器的bean,通过BeanDefinitionRegistry.registerBeanDefinitions手工注册进来
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) {
        //检查Color类是否注册到容器中
        Boolean definition=registry.containsBeanDefinition("color");
        if(!definition){
            //指定对应的Bean
            RootBeanDefinition rootBeanDefinition=new RootBeanDefinition("com.example.springboottest.entity.Yellow");
            //指定注入到容器的名字
            registry.registerBeanDefinition("yellow",rootBeanDefinition);
        }

    }
}

3、原生配置文件引入
3.1、@ImportResource

	<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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">

    <bean id="green" class="com.example.springboottest.entity.Green">
        <property name="a" value="aaaaaaaaa"/>
        <property name="b" value="忘情水"/>
    </bean>
</beans>
@Configuration(proxyBeanMethods = false)
@ImportResource("classpath:beanconfig.xml")
public class BootConfig {
}

4、条件装配@Conditional
满足Conditional指定条件的,则进行组件注入
在这里插入图片描述

//@Import({MyImportBeanDef.class}) 
//Import和ImportResource执行顺序在@Bean之后
@Configuration(proxyBeanMethods = false)
public class BootConfig {

    @Bean("green")
    public Green getGreenName(){
        return new Green();
    }

    @ConditionalOnBean(name="green")//如果容器中存在green的组件,则注入
    @Bean("black123")
    public Black getBlackName(){
        return new Black();
    }
}
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class SpringboottestApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(SpringboottestApplication.class, args);
        //容器中是否存在该组件
        System.out.println(run.containsBeanDefinition("black123"));
    }

}