1.springboot的特点
1.1 依赖管理
- 配置文件里见到很多 spring-boot-starter-*: *就某种场景
- 只要引入starter,这个场景的所有常规需要的依赖都会自动引入
官方地址:
https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter
- 见到 *-spring-boot-starter: 就是第三方为提供的简化开发的场景启动器。
- 默认版本号查看方式:pom配置点击—>spring-boot-starter-parent —> spring-boot-dependencies
- 修改默认的版本依赖
<properties>
<mysql.version>5.1.43</mysql.version>
</properties>
1.2 自动装配
- 自动配好了tomcat依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.3.4.RELEASE</version>
<scope>compile</scope>
</dependency>
- 自动配好SpringMVC常用功能;
- 自动配好了web常见的功能:如字符串编码的问题。
- 无需包扫描配置:主程序所在包及其下面的所有子包都会被扫描进来。想要改变扫描路径
■ @SpringBootApplication(scanBasePackages=“com.test”)
■ 或者@ComponentScan 指定扫描路径 - 按需加载自动配置项: 根据需求引入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"));
}
}