SpringBoot入门Bean的扫描、Bean的注册、Bean自动配置原理、自定义starter

SpringBoot
入门
配置文件
起步依赖
自动配置
自定义starter

SpringBoot是Spring提供的一个子项目,用于快速构建Spring应用程序
Spring Framework 核心功能
Spring Data 数据获取
Spring AMQP 消息传递
Spring Security 认证授权
Spring Cloud 服务治理
传统方式构建spring应用程序,
缺点
导入依赖繁琐
项目配置繁琐
web.xml 、applicationContext.xml、SpringMVC.xml

SpringBoot 项目构建
特性
1、起步依赖
本质上就是一个Maven坐标,整合了完成一个功能需要的所有坐标

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

相当把web开发的所有坐标都引入了

2、自动配置
遵循约定大于配置的原则,在boot程序启动后,一些bean对象会自动注入到ioc容器,不需要手动声明,简化开发。
3、可以快速构建项目,还有其他特性
内嵌Tomcat 、Jetty 无需部署War文件
外部化配置
不需要XML配置(properties/yml)

SpringBoot入门
只需要引入一个web依赖,就相当把刚才的所有包都引入了

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
       

1、创建Maven工程
2、导入spring-boot-starter-web起步依赖
3、编写controller
4、提供启动类

yml配置文件的书写和获取
@Value(“${键名}”) 第一种方式读取SpringBoot的配置文件,
在实体类里的每一个属性上都加一个注解。

使用@ConfigurationProperties(prefix=“前缀”)
实体类里的属性名要与配置项里的字段名字一致,springboot会自动帮我们取配置项里的字段值

Bean扫描
Bean注册
注册条件
自动配置原理
自定义starter

Bean对象的管理
Bean扫描
在spring的时候使用了
标签:<context:component-scan base-package=“com.mall”/>
注解:@ComponentScan(basePackages=“com.mall”)
@SpringBootApplication注解 下面包含三个子注解
@ComponentScan 这个注解,相当在启动类上添加了这个注解,不需手动添加了,可以自动扫描的Controller、Service,不指定包路径,默认扫描添加的这个类的包及子包,SpringBoot默认扫描启动类所在的包及其子包
在这里插入图片描述
Bean的注册
@Component
@Controller
@Service
@Repository
如果要注册的bean对象来自第三方(不是自定义的),是无法用@Component及衍生注解声明Bean的
可以使用
@Bean
@Import
如果要注册第三方bean,建议在配置类中集中注册

@Configuration
public class CommonConfig{
   //对象默认的名字是:方法名
   //如果方法的内部需要使用到ioc容器中已经存在的bean对象,那么只需要在方法上声明即可,spring会自动的注入。
	@Bean
	public Country country(){
		return new Country();
	}
}

@Import
导入 配置类
导入 ImportSelector 接口实现类

自定义组合注解,然后在springboot启动类注解下面直接使用@EnableCommonConfig
在这里插入图片描述
在这里插入图片描述

SpringBoot的自动配置原理
自动配置-源码分析
程序引入spring-boot-starter-web起步依赖,启动后,会自动往ioc容器中注入DispatcherServlet,引入这个包会自动注DispatcherServlet

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

在启动类里获取这个bean,就可以获取到

@SpringBootApplication
public class SpringbootAutoConfigApplication {

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(SpringbootAutoConfigApplication.class, args);
        System.out.println(context.getBean("dispatcherServlet"));
          }
}

@SpringBootConfiguration
@EnableAutoConfiguration
在这里插入图片描述
在这里插入图片描述
在SpringBoot2.7之前读取的配置文件名字是spring.factories,现在SpringBoot2.7之后的读取的配置文件名字是imports,2.7-3.0两个配置文件都是兼容的,在3.0以后的话只读取imports
在这里插入图片描述

在这里插入图片描述
这个类上有一个注解,@ConditionalOnClass含义是如果存在DispatcherServlet.class这个类,就生效,会自动配置,当引入了starter-web坐标,就会引入DispatcherServlet这个类,所以就自动注入到IOC中了。
在这里插入图片描述
自动配置的原理:就是提供一个自动配置类,然后把类名写到指定的配置文件中。
@ComponentScan 扫描这个类所在的包和它的子包
在这里插入图片描述

1、在主启动类上添加了SpringBootApplication注解,这个注解组合了EnableAutoConfiguration注解
2、EnableAutoConfiguration注解又组合了Import注解,导入了AutoConfigurationImportSelector类
3、实现selectImports方法,这个方法经过层层调用,最终会读取META-INF 目录下的 后缀名 为imorts的文件,boot2.7以前的版本,读取的是spring.factories文件
4、读取到全类名了之后,会解析注册条件,也就是@Conditional及其衍生注解,把满足注册条件的Bean对象自动注入到IOC容器中。

自定义starter

自动配置功能 xxxx autoconfigure
依赖管理功能 xxxx starter
自定义mybatis 的starter
1、创建dmybatis-spring-boot-autoconfigure模块,提供自动配置功能,并自定义配置文件META-INF/spring/xxx.imports
2、创建dmybatis-spring-boot-starter模块,在starter中引入自动配置模块。
将来别人要使用的话,就直接引入starter这个工程。

@AutoConfiguration//表示当前类是一个自动配置类
public class MyBatisAutoConfig {

    //SqlSessionFactoryBean
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean;
    }

    //MapperScannerConfigure
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer(BeanFactory beanFactory){
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        //扫描的包:启动类所在的包及其子包
        List<String> packages = AutoConfigurationPackages.get(beanFactory);
        String p = packages.get(0);
        mapperScannerConfigurer.setBasePackage(p);

        //扫描的注解
        mapperScannerConfigurer.setAnnotationClass(Mapper.class);
        return mapperScannerConfigurer;
    }


}


  • 21
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
引用提到的错误信息"No qualifying bean of type 'xxx' available"通常出现在使用SpringContextHloder#getBean()方法时,说明在Spring容器中找不到对应类型的bean。这可能是由于配置问题导致的。引用指出,你的项目使用的是mybatis-spring-boot-starter的1.0版本。而引用提到,如果你非要使用1.0.0版本的mybatis-spring-boot-starter,那么你的spring-boot-starter-parent必须调低版本。 要解决这个问题,你可以尝试以下步骤: 1. 确认你的Spring配置文件中是否正确配置了相关的bean。可以检查bean的定义和注入方式。 2. 检查你的pom.xml文件,确认引入的mybatis-spring-boot-starter版本与其他依赖项的版本兼容。如果版本不兼容,可能会导致bean无法注入。 3. 如果你确实需要使用1.0.0版本的mybatis-spring-boot-starter,那么根据引用所说,你需要将spring-boot-starter-parent的版本调低。在pom.xml文件中修改parent标签下的版本号为一个低于1.5.19.RELEASE的版本。 4. 如果上述步骤仍然无法解决问题,可能是其他配置或依赖项的问题。你可以尝试查看日志文件或调试代码,以找出更具体的错误信息。 总结来说,当出现"no qualifying bean of type"的错误时,通常是由于Spring容器无法找到对应类型的bean导致的。你可以检查配置、版本兼容性和其他相关问题来解决这个问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [使用SpringBoot获取bean时出错:No qualifying....](https://blog.csdn.net/QINGZHID/article/details/117369243)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [springboot整合mybatis报 NO qualifying bean of type 'com.jvtd.mapper.auth.AdminUserMapper' 把我坑了1...](https://blog.csdn.net/qq_17231297/article/details/82219502)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NeilNiu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值