SpringBoot 底层注解

1、组件添加

1.1 @Configuration

	@Configuration(proxyBeanMethods = true)
		默认true
		告诉SpringBoot这是一个配置类 == 配置文件

public class MyConfig {
}

  1. 配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的
  2. 配置类本身也是组件,主启动方法可以获取到组件的信息
  3. proxyBeanMethods:代理bean的方法
    Full(proxyBeanMethods = true),【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
    Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
    组件依赖必须使用Full模式默认。其他默认是否Lite模式

1.2@Bean、@Component、@Controller、@Service、@Repository

  • @Bean
    -------给容器中添加组件。默认以方法名作为组件的id,也可以用value属性指定。返回类型就是组件类型。返回的值,就是组件在容器中的实例
    -------注解告诉Spring这个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的bean。通常方法体中包含了最终产生bean实例的逻辑。
    -------作用于方法。
  • @Component
    -------注解表明一个类会作为组件类,并告知Spring要为这个类创建bean。
    -------作用于类
  • @Controller
    -------用于标记在一个类上,使用它标记的类就是一个SpringMvc Controller对象,分发处理器会扫描使用该注解的类的方法,并检测该方法是否使用了@RequestMapping注解。
    -------只是定义了一个控制器类,而使用@RequestMapping注解的方法才是处理请求的处理器。
    -------标记在一个类上还不能真正意义上说它就是SpringMvc的控制器,应为这个时候Spring还不认识它,这个时候需要把这个控制器交给Spring来管理。有两种方式可以管理:
  • @Service
    -------此注注解属于业务逻辑层,service或者manager层
    -------默认按照名称进行装配,如果名称可以通过name属性指定,如果没有name属性,注解写在字段上时,默认去字段名进行查找,如果注解写在setter方法上,默认按照方法属性名称进行装配。当找不到匹配的bean时,才按照类型进行装配,如果name名称一旦指定就会按照名称进行装配
  • @Repository
    -------此注解是持久层组件,用于标注数据访问组件,即DAO组件,将Dao类声明为bean

1.3@ComponentScan、@Import

  • @ComponentScan 参考 @ComponentScan
  • @Import
    -------给容器中导入多个组件,默认组件的名字就是全类名

1.4@Conditional

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

2、原生配置文件引入

2.1@ImportResource

------用于导入Spring的配置文件,让配置文件里面的内容生效;(就是以前写的springmvc.xml、applicationContext.xml)
想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上。
注意!这个注解是放在主入口函数的类上,而不是测试类上


3、配置绑定

3.1@Component +@EnableConfigurationProperties+ @ConfigurationProperties

------只有在容器中的组件,才会拥有SpringBoot提供的强大功能

  • @Component和@ConfigurationProperties可以使Java中的Bean和配置文件绑定,在此种场景下,当Bean被实例化时,@ConfigurationProperties会将对应前缀的后面的属性与Bean对象的属性匹配。符合条件则进行赋值。
  • 使用@ConfigurationProperties和@Bean注解在配置类的Bean定义方法上。
  • 使用@ConfigurationProperties注解到普通类,然后再通过@EnableConfigurationProperties定义为Bean。
    参考

@ConfigurationProperties(prefix = “***”) 用在实体类中,prefix = 配置文件的前缀,将同名属性初始化
@Component 将类定义为一个bean的注解
@EnableConfigurationProperties({***.class}) 用在主启动类,


4、自动配置原理入门


@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication{}

引入自动配置类

4.1@SpringBootConfiguration

------@Configuration。代表当前是一个配置类

4.2@ComponentScan

------指定扫描哪些,Spring注解

4.3@EnableAutoConfiguration


@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}

  • 4.3.1 @AutoConfigurationPackage
    ------自动配置包,指定了默认的包规则,包扫描

@Import(AutoConfigurationPackages.Registrar.class)  //给容器中导入一个组件
public @interface AutoConfigurationPackage {}
//利用Registrar给容器中导入一系列组件
//将指定的一个包下的所有组件导入进来?MainApplication 所在包下。

  • 4.3.2 @Import(AutoConfigurationImportSelector.class)
    1、 利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
    2、 调用List configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类
    3、 利用工厂加载 Map<String, List> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件
    4、 从META-INF/spring.factories位置来加载一个文件。
    默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
    spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META- INF/spring.factories
    ******文件里面写死了spring-boot一启动就要给容器中加载的所有配置类
    spring-boot-autoconfigure-2.3.4.RELEASE.jar/META-INF/spring.factories

按需开启自动配置项

  • 虽然我们127个场景的所有自动配置启动的时候默认全部加载。xxxxAutoConfiguration
    按照条件装配规则(@Conditional),最终会按需配置。

修改默认配置

	@Bean
	@ConditionalOnBean(MultipartResolver.class)  //容器中有这个类型组件
	@ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) //容器中没有这个名字 multipartResolver 的组件
	public MultipartResolver multipartResolver(MultipartResolver resolver) {
	          //给@Bean标注的方法传入了对象参数,这个参数的值就会从容器中找。
	          //SpringMVC multipartResolver。防止有些用户配置的文件上传解析器不符合规范
		// Detect if the user has created a MultipartResolver but named it incorrectly
		return resolver;
	}
    //给容器中加入了文件上传解析器;

SpringBoot默认会在底层配好所有的组件。但是如果用户自己配置了以用户的优先

总结:

  • SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
  • 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿,xxxProperties和配置文件进行了绑定
  • 生效的配置类就会给容器中装配很多组件
  • 只要容器中有这些组件,相当于这些功能就有了
  • 定制化配置
    用户直接自己@Bean替换底层的组件
    用户去看这个组件是获取的配置文件什么值就去修改。application.properties文件中去修改
    xxxxxAutoConfiguration —> 组件 —> xxxxProperties里面拿值 ----> application.properties

最佳实践

  • 引入场景依赖

  • 查看自动配置了哪些(选做)
    ···自己分析,引入场景对应的自动配置一般都生效了
    ··· 配置文件 application.properties 中debug=true开启自动配置报告。Negative 不生效 / Positive生效
    ···是否需要修改

  • 参照文档修改配置项

  • 自己分析。xxxxProperties绑定了配置文件的哪些。

  • 自定义加入或者替换组件
    ···@Bean、@Component等
    ··· 自定义器 XXXXXCustomizer;

5、开发技巧

Lombok

简化JavaBean开发

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        
		idea中搜索安装lombok插件

dev-tools

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>

项目或者页面修改以后:Ctrl+F9;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值