经过上篇文章了解了spring自动配置的原理后,我们可以自定义第三方starter,在pom文件中引入依赖就自动注入到IOC容器中.
主要分为以下几步:
1.创建自动配置工程与起步工程,
2.在自动配置工程中创建配置类与要注入的类
package com.hy.config;
import com.hy.data.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
/**
* @author HY
* @ClassName MyAutoConfiguration
* @Description TODE
* @DateTime 2021/1/25 22:08
* Version 1.0
*/
public class MyAutoConfiguration {
@Bean
@ConditionalOnMissingBean(name="data")
public User getUser() {
return new User();
}
}
User:
package com.hy.data;
/**
* @author HY
* @ClassName User
* @Description TODE
* @DateTime 2021/1/25 22:12
* Version 1.0
*/
public class User {
}
3.在resources下创建配置文件META-INF/spring.factories,并且讲上面自定义的配置类的全限定名写入。
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.hy.config.MyAutoConfiguration
关于什么时候加载spring.factories以及过程请看这篇文章
4.在起步工程中引入自动配置工程的依赖
自动配置工程的依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hy</groupId>
<artifactId>myproject-spring-boot-autoconfigure</artifactId>
<version>1.0-SNAPSHOT</version>
<!--起步依赖-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
起步工程依赖自动配置工程
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hy</groupId>
<artifactId>myproject-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.hy</groupId>
<artifactId>myproject-spring-boot-autoconfigure</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
5.测试
新建一个测试工程,在pom文件中引入starter:
<dependencies>
<dependency>
<groupId>com.hy</groupId>
<artifactId>myproject-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
我没有手动注入bean,看下能不能获取到bean:
package com.hy.enable;
import com.hy.config.MyAutoConfiguration;
import com.hy.data.User;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Import;
/**
* @author HY
* @ClassName SpringApplication
* @Description TODE
* @DateTime 2021/1/25 22:47
* Version 1.0
*/
@SpringBootApplication
public class SpringApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = org.springframework.boot.SpringApplication.run(SpringApplication.class, args);
User bean = run.getBean(User.class);
System.out.println(bean);
}
}
输出结果:
okkkkkk!!!