来自一道海康威视的面试题
初次听到这个题目,完全搞不清考察的知识点
嗐~ 我太菜了;
一通搜索后总结下这个题目;
这个知识点涉及的是spring的自动装配;spring的考察点我只看了面向切面(AOP)和依赖注入(IOC)[其实这两部分了解的也不够深入嗐~]
废话不多说,走着~
自己定义的starter需要有自己的独特功能
大致步骤
- 引入依赖。引入自动装配类
spring-boot-autoconfigure
依赖 - 编写自动装配类。满足某配置条件情况下,实例化该自动装配类提供的service;
- 编写
spring-factories
配置文件。在该文件中指定自动装配类;
一、引入依赖
pom.xml
<!-- 在编译时在META-INF 下生成spring-configuration-metadata.json文件;该文件主要为idea使用,即可以通过在application.properties文件中通过ctrl+点击进入配置属性所在的类中-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- 提供自动装配功能-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
二、配置文件读取类
DemoProperties.java
/**
* @author
* @Description:
* 读取配置文件:自动配置
* @date 2022/2/24 10:54
*/
@Component
@ConfigurationProperties(prefix = "demo")
public class DemoProperties {
private String sayWhat;
private String toWho;
public String getSayWhat() {
return sayWhat;
}
public void setSayWhat(String sayWhat) {
this.sayWhat = sayWhat;
}
public String getToWho() {
return toWho;
}
public void setToWho(String toWho) {
this.toWho = toWho;
}
}
配置了@ConfigurationProperties(prefix = “demo”)就可以在引入了这个jar包 的服务的配置文件中使用demo.sayWhat=""
了
三、服务类
自动装配类会判断classpath下是否存在该服务类;
- 存在就加载我们的自动装配类
- 不存在,就去实例化服务类的bean实例
DemoService.java
/**
* @author qianwenqian
* @Description: 随便定义一个Service
* @date 2022/2/24 13:16
*/
public class DemoService {
private String sayWhat;
private String toWho;
public DemoService(String sayWhat, String toWho) {
this.sayWhat = sayWhat;
this.toWho = toWho;
}
public String toSay(){
return this.sayWhat+"! "+this.toWho;
}
}
四、自动装配类
@ConditionalOnProperty
: 属性条件注解
它是springboot自动装配的重要工具,添加此注解表示一个类是否要被Spring上下文加载,如果满足条件则加载,若不满足条件则不加载;
配置文件:demo.isOpen = true
,demo.isOpen的值等于havingValue
的值,加载DemoConfig配置类;
DemoConfig.java
@Configuration
/**
* 配置前缀、配置名字、是否存在值
*/
@ConditionalOnProperty(
prefix = "demo",
name = "isOpen",
havingValue = "true"
)
public class DemoConfig {
@Autowired
private DemoProperties demoProperties;
//得到配置的值
@Bean(name = "demo")
public DemoService demoService(){
return new DemoService(demoProperties.getSayWhat(),demoProperties.getToWho());
}
}
五、编写spring.factories
在项目的resources下定义一个META-INF 文件夹,并新建spring.factories
文件,指定autoconfigure
加载的自动装配类是哪个
# 指定autoconfigure加载的自动装配类是哪个
org.springframework.boot.autoconfigure.EnableAutoConfiguration = com.demo.starter.config.DemoConfig
六、修改pom文件打包内容
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.1.RELEASE</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
其中,<skip>true</skip>
如果不增加这个,会导致maven clean install
后,在其他项目中引用我们定义的这个pom时出现找不到 class文件报错信息
这里说下两种打包方式
maven-compiler-plugin
这种方式打出的包是一个普通的jar,并不能执行;但是能被引用其中的bean,不含有boot-inf,没有依赖被打进去;spring-boot-maven-plugin
这种方式打出的包可执行,打好的包放在服务器上可运行;含有boot-inf,有完整的依赖包;