容器-注册

默认,分层注解能起作用的前提是,这些组件必须在主程序所在的包 及其 子包结构下

Spring为我们提供了快速的MVC分层注解

1、@ControlLer控制器
2、@Service 服务层
3、@Repository持久层
4、@Component 组件
(这些注解都是组件的意思,注解是给人看的,都能存入组件)

@ComponentScan ———– 组件批量扫描

例:
@ComponentScan(basePackages="com.atguigu.spring.controller)
按照包的路径扫描
组件批量扫描,只扫利用Spring 相关注解注册到容器中的组件
(不常用,老实把组件放到 主程序所在的包里面 比较好)

第三方组件想要导入容器中,没办法快速标注分册注解

1.@Bean,自己new,注册给容器
2.@Import(CoreConstants.class) 即可导入组件 (注解标注一次就可以了)

Scope 调整组件的作用域

1、@Scope("prototype"):非单实例:
容器启动的时候不会创建非单实例组件的对象。
什么时候获取,什么时候创建

2、@Scope("singleton"):单实例:默认值
容器启动的时候会创建单实例组件的对象。
容器启动完成之前就会创建好
    @Lazy:懒加载(单例模式可以继续调整为懒加载)
        容器启动完成之前不会创建懒加载组件的对象,-> 什么时候获取,什么时候创建

3、@Scope("request"):同一个请求单实例

4、@Scope("session"):同一次会话单实例

单实例:获取到的只有一个对象,唯一
多实例:什么时候获取,什么时候创建一个实例对象
  • FactoryBean在容器中放的组件的类型,是接口中泛型指定的类型,组件的名字是工厂自己的名字
    2025-09-08_19-31-35-0.png
  • 场景:如果制造某些对象比较复杂的时候,利用工厂方法进行创建
  • FactoryBean < T>

条件注解@Conditional -条件注册

2025-09-08_20-26-54-0.png

2025-09-08_20-27-35-0.png
WindowsCondition类 继承Condition接口,
在组件上面放置@Conditional(WindowsCondition.class) 就可以根据WindowsCondition类中的逻辑来判断,组件是否要放到容器中

官方提前给了很多“预制”的派生注解

==注册组件的各种方式==

注册组件的各种方式
实验 内容 目标
实验1 @Bean 理解单例
实验2 获取Bean 理解组件获取方式
实验3 @Configuration 理解MVC分层模型对应注解
实验4 @Controller
实验5 @Service
实验6 @Respository
实验7 @Component
实验8 @ComponentScan 理解批量扫描
实验9 @Import 理解按需导入
实验10 @Scope 理解组件作用域
实验11 @Lazy 理解懒加载
实验12 FactoryBean 理解工厂Bean
实验13 @Conditional【难点】 理解条件注册

==Conditional 派生注解==

@Conditional 派生注解 作用
@ConditionalOnCloudPlatform 判定是否指定的云平台,支持:NONE、CLOUD_FOUNDRY、HEROKU、SAP、NOMAD、KUBERNETES、AZURE_APP_SERVICE
@ConditionalOnRepositoryType 判定是否指定的JPA类型,支持:AUTO、IMPERATIVE、NONE、REACTIVE
@ConditionalOnJava 判断Java版本范围,支持:EQUAL_OR_NEWER、OLDER_THAN
@ConditionalOnMissingBean 容器中没有指定组件,则判定true
@ConditionalOnMissingFilterBean 容器中没有指定的Filter组件,则判定true
@ConditionalOnGraphQlSchema 如果GraphQL开启,则判定true
@ConditionalOnSingleCandidate 如果容器中指定组件只有一个,则判定true
@ConditionalOnClass 如果存在某个类,则判定true
@ConditionalOnCheckpointRestore 判断是否导入了 org.crac.Resource ,导入则判定true
@ConditionalOnNotWebApplication 如果不是Web应用,则判定true
@ConditionalOnEnabledResourceChain 如果web-jars存在或者resource.chain开启,则判定true
@Conditional 派生注解 作用
@Profile 如果是指定Profile标识,则判定true;【后面会说】
@ConditionalOnMissingClass 如果不存在某个类,则判定true
@ConditionalOnWebApplication 如果是Web应用,则判定true
@ConditionalOnResource 如果系统中存在某个资源文件,则判定true
@ConditionalOnNotWarDeployment 如果不是war的部署方式,则判定true
@ConditionalOnDefaultWebSecurity 如果启用了默认的Security功能,则判断true
@ConditionalOnExpression 如果表达式计算结果为true,则判定true
@ConditionalOnWarDeployment 如果是war的部署方式,则判定true
@ConditionalOnBean 如果容器中有指定组件,则判定true
@ConditionalOnThreading 如果指定的threading激活,则判定true
@ConditionalOnProperty 如果存在指定属性,则判定true
@ConditionalOnJndi 如果JNDI位置存在,则判定true

补充:
配置类:存框架底层的配置
@Configuration 告诉Spring容器,这是一个配置类

给容器中注册一个自己的组件,容器中的每个组件都有自己的名字,方法名就是组件的名字。