1.外部包注入的方式
Spring Boot自动配置默认扫描当前工程的package,也就是所在@SpringBootApplication的包路径
,所以外部包一般是不能直接被扫描到(当@SpringBootApplication的包路径和外部包的package一样时,外部包中的@service,@Configuration也会被注入),如果要扫描外部包可以通过以下三种方式。
方法一:使用@ComponentScan或@ComponentScans
方式二:使用@Import
方式三:使用 spring.factories 文件
2.作用
spring.factories 的作用是使用外部 jar 时不用再写配置,会自动加入已经配置好的配置,实现开箱即用。
3.SpringBoot自动配置的实现原理
SpringBoot的核心就是自动配置,自动配置又是基于条件判断来配置Bean,自动配置就是将对象实例化到容器中。(具体源码可以看spring-boot-autoconfigure的jar包)。
springboot进行实例化时SpringFactoriesLoader加载META-INF/spring.factories文件,将配置文件载入到spring容器。
会过滤出key为org.springframe.boot.autoconfigure.EnableConfiguration全限定名对应的值。
(最主要的注解就是@enableAutoConfiguration,而这个注解会导入一个EnableAutoConfigurationImportSelector的类,而这个类会去读取一个spring.factories下key为EnableAutoConfiguration全限定名对应值.)
收集配置文件中配置工厂类。
@SpringBootApplication注解其实就包含@SpringBootConfiguration,EnableAutoConfiguration,ComponentScan这三个注解 @SpringBootConfiguration :springbootp配置 @EnableAutoConfiguration :开启springboot自动配置 @ComponentScan :springboot的作用域
自己实现一个自动配置
1.定义一个服务类
package cn.xl.service;
public class UserMyService {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String say() {
return "I am " + name;
}
}
2.定义一个属性映射类
package com.util;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "autoconfiguser")
public class UserMyProperties {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3.创建一个自动配置类
package com.autoconfig;
import cn.xl.service.UserMyService;
import com.util.UserMyProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties(UserMyProperties.class)
@ConditionalOnClass(UserMyService.class)
@ConditionalOnProperty(prefix = "autoconfiguser",value = "enabled",matchIfMissing = true)
public class UserMyAutoConfig {
@Autowired
UserMyProperties userMyProperties;
@Bean
public UserMyService autoConfigUserService() {
UserMyService userMyService = new UserMyService();
userMyService.setName(userMyProperties.getName());
return userMyService;
}
}
4.创建属性文件
在资源目录下创建一个META-INF/spring.factories 配置自动配置的属性文件
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.autoconfig.UserMyAutoConfig
5.启动测试
启动后UserMyService就可以注入到容器中

本文详细介绍了SpringBoot如何扫描并注入外部包,包括三种方式:使用`@ComponentScan`,`@Import`和`spring.factories`文件。`spring.factories`使得在使用外部jar时能自动加载配置。SpringBoot自动配置基于条件判断配置Bean,通过`@SpringBootApplication`、`@EnableAutoConfiguration`和`@ComponentScan`注解实现。同时,展示了如何自定义一个自动配置类,包括服务类、属性映射类和自动配置类的创建,并在`spring.factories`中注册。启动后,自定义服务类即可被注入到容器中。
1905

被折叠的 条评论
为什么被折叠?



