# Springboot自定义start ## 1.bean的管理 在springboot中既没有用到 也没用到@ComponentScan 的原因是@SpringBootApplication是一个组合注解,里面已经有了@CompnentScan \`\`\`java @SpringBootApplication \|\| \\/ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan( excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class} )} ) 传统spring扫描使用标签: 通过注解来代替: @ComponentScan(basePackages="com.woniu") \`\`\` \*\*想要@ComponentScan生效那么 启动类就必须放最外面\*\* ## 2.bean注册 ### 2.1.方式一:通过@Bean #### 2.1.1准备一个自定义的bean 1.创建一个maven项目 注意:包路径一定要和启动类的路径保持一致,否则导致@ComponentScan扫描不到 2.在对应包下面创建 \`\`\`java public class MyBean { private String name; private String password; private Integer age; private Integer sex; } \`\`\` 3.使用maven进行安装到本地 !\[image-20260518102413745\](D:\\课件\\08_springboot自定义start\\img\\image-20260518102413745.png) #### 2.1.2.在自己的项目中导入刚才已经打包好的jar \`\`\`xml cn.woniu BeanTest 1.0-SNAPSHOT \`\`\` #### 2.1.3通过配置类+@Bean实现注册 \`\`\` @Configuration public class CommontConfig{ @Bean public MyBean mybean(){ return new MyBean(); } } \`\`\` #### 2.1.4获取bean4种方式 \`\`\` @Autowired private MyBean myBean; @Resource private MyBean myBean; @Autowired @Qualifier("mybean") private MyBean myBean; @Resource(nane="mybean") private MyBean myBean; \`\`\` @Autowired属于spring提供,优先按照类型装配,其次按照名字装配(需搭配@Qualifier) @Resource属于java提供,优先按照按照名字装配,其次按照类型装配 #### 2.1.5补充bean 的注册(如果需要前置依赖其他bean对象) \`\`\`java @Configuration public class MyConfig { @Bean public MyBean getMyClass() { return new MyBean(); } //如果方法的内部需要使用到IOC容器的Bean对象,则需要在方法形参上声明即,Spring会自动装配 @Bean public Stu getStu(MyBean myBean){ System.out.println(myBean); return new Stu(); } } \`\`\` ### 2.2方式2 通过@Import 一般在启动类添加该注解:该注解可以指明需要放入IOC的容器 多个使用数组即可 @Import({类.class,......}) 额外:改变controller层位置,不让其处于启动类所在包,使用@Import使其注册 \`\`\`java @SpringBootApplication @Import({TestController.class}) public class App { public static void main( String\[\] args ) { SpringApplication.run(App.class, args); } } \`\`\` 如果要注册的bean对象来自于第三方,在无法使用@Component的情况下: #### 2.2.1写法一:直接导入目标类的字节码(不推荐,不好管理) \`\`\` @Import({需要加载的类.class}) \`\`\` \`\`\` @Autowired private 需要加载的类 需要加载的类 \`\`\` #### 2.2.2写法2:导入配置类,依然把目标类通过@Bean写在配置类中 \`\`\`java public class MyConfig { @Bean public MyBean getMyClass() { return new MyBean(); } @Bean public Stu getStu(MyBean myBean){ System.out.println(myBean); return new Stu(); } } \`\`\` \`\`\`java @SpringBootApplication @Import({MyConfig.class}) public class App { public static void main( String\[\] args ) { SpringApplication.run(App.class, args); } } \`\`\` #### 2.2.3写法3 导入ImportSelector接口实现类 springboot会自动执行重写的selectImports方法,将返回的数组中的类中的bean添加到容器中 ##### MyImportSelector: \`\`\`java public class MyImportSelector implements ImportSelector { @Override public String\[\] selectImports(AnnotationMetadata importingClassMetadata) { return new String\[\]{"cn.woniu.domain.MyConfig"}; } } \`\`\` \`\`\`java public class MyConfig { @Bean public MyBean getMyClass() { return new MyBean(); } @Bean public Stu getStu(MyBean myBean){ System.out.println(myBean); return new Stu(); } } \`\`\` \`\`\`java @SpringBootApplication @Import({MyImportSelector.class}) public class App { public static void main( String\[\] args ) { SpringApplication.run(App.class, args); } } \`\`\` #### 2.2.4写法4:在写法3上利用自定义组合注解更优雅的开启 通过组合注解,保证启动类的注解不用传参,看起来更加舒服(类似于@SpringBootApplication) 自定义注解类EnableMyConfig,在该注解类上添加@Import 元注解: @Target(ElementType.\*TYPE\*) @Retention(RetentionPolicy.\*RUNTIME\*) \`\`\`java @Target(ElementType.TYPE) @retention(RetentionPolicy.RUNTIME) @Import(MyConfig.class) public @interface EnableMyConfig { } \`\`\` 最后在启动类上就可以用自定义注解来替代原本的@Import \`\`\`java @SpringBootApplication @EnableMyConfig public class App { public static void main( String\[\] args ) { SpringApplication.run(App.class, args); } } \`\`\` ### 2.3.bean注册条件 #### 2.3.1@ConditionalOnProperty 配置存在对应属性才会注册该bean \`\`\`java @Configuration public class MyConfig { @Bean @ConditionalOnProperty(prefix = "student",value = "name") public MyBean myBean(){ return new MyBean(); } } \`\`\` \`\`\`yml student: name: "Student" \`\`\` \`\`\`java @Autowired MyBean myBean @GetMapping("/myBean") public String hello() { System.out.println(myBean); return ""; } \`\`\` 测试:如果yml有配置,正常打印,如果没有配置,则开服报错: \`\`\`java Field myClass in com.woniu.springboot_quick_start.controller.HelloController required a bean of type 'org.example.pojo.MyClass' that could not be found. \`\`\` #### 2.3.2@ConditionalOnMissingBean 当不存在当前类型bean时才会注册该bean \`\`\`java @Configuration public class MyConfig { @Bean public MyClass myClass(){ return new MyClass(); } @Bean @ConditionalOnMissingBean(MyClass.class) public MyBean myBean(){ return new MyBean(); } } \`\`\` 测试: 如果注释掉MyClass相关bean,则spring会注册class, 如果有MyClass相关bean,则开服报错: Field myClass in com.woniu.springboot_quick_start.controller.HelloController required a bean of type 'org.example.pojo.MyClass' that could not be found. #### 注意:@Bean 的代码顺序会影响@ConditionalOnMissingBean Spring 容器在加载 @Configuration 类时,会按照 类中 @Bean 方法的声明顺序依次创建 Bean 并注册到 Spring 容器中。 如果把 MyClass的bean放在myBean的bean的下方,则spring会优先判断MyBean的bean,此时MyClass的bean还未来得及注册,程序会正常注册class \`\`\`java @Autowired MyBean myBean @GetMapping("/myBean") public String hello() { System.out.println(myBean); return ""; } \`\`\` #### 2.3.3@ConditionalOnClass 当前环境存在指定类时才会注册该bean \`\`\`java @Configuration public class MyConfig { @Bean @ConditionalOnClass(name = "cn.woniu.bean.MyClass") public MyBean myBean(){ return new MyBean(); } } \`\`\` 测试: @ConditionalOnClass(name="cn.woniu.bean.MyClass"):ICO容器中有,所以满足条件,则会正常注册class 如果改为@ConditionalOnClass(name="org.xx.xx")由于当前项目没有org.xx.xx,故条件不满足,则不会注册class,导致开服报错 Field myClass in com.woniu.springboot_quick_start.controller.HelloController required a bean of type 'org.example.pojo.MyClass' that could not be found. #### 2.3.4@ConditionalOnClass和@ConditionalOnMissingBean 区别 @ConditionalOnMissingBean 关心的是spring容器有没有bean(依赖了并且要被spring注册了才存在) @ConditionalOnClass 关心的是指定的全限定名类是否存在当前环境(依赖了就存在) ## 3.属性类+配置类的组合场景 1 从属性类中读取yaml配置 2 配置类中注入属性类 3 在@Bean中从注入的属性类身上拿到想要的属性充当bean的属性 ### 用法1:属性类@Component 特点:在最初的时候就会把DogProperties放入IOC中 application.yml: \`\`\`yml dog: type: 哈士奇 color: 棕色 \`\`\` DogProperties: \`\`\`java @Component @ConfigurationProperties(prefix = "dog") @Data public class DogProperties { private String type; private String color; } \`\`\` DogConfig: \`\`\`java @Configuration public class DocConfig { @Autowired private DogProperties dogProperties; @Bean public Dog dog(){ Dog dog = new Dog(); dog.setColor(dogProperties.getColor()); dog.setType(dogProperties.getType()); return dog; } } \`\`\` dog: \`\`\`java @Data public class Dog { private String type; private String color; } \`\`\` \`\`\`java @SpringBootApplication @MapperScan("cn.woniu.mapper") public class App { public static void main( String\[\] args ) { ConfigurableApplicationContext run = SpringApplication.run(App.class, args); Dog bean = run.getBean(Dog.class); System.out.println(bean); System.out.println(bean.getColor()); System.out.println(bean.getType()); } } \`\`\` ### 用法2:属性类无@Component+配置类EnableConfigurationProperties 特点:在一开始并不会把DogProperties放入IOC中(因为没有@Component),而是要注册DogConfig时才会把DogProperties提前放入IOC中,因此和用法1对比的话,用法2有以下好处: 1 并且如果DogConfig头上有注册条件并且不满足时,则DogProperties也压根不会注册,减少内存占用 2 包扫描只需要扫描DogConfig即可,DogProperties不需要扫描(本身也没有@Component) DogProperties: \`\`\` @ConfigurationProperties(prefix = "dog") @Data public class DogProperties { private String type; private String color; } \`\`\` DogConfig: \`\`\`java @Configuration @EnableConfigurationProperties(DogProperties.class) public class DocConfig { @Autowired private DogProperties dogProperties; @Bean public Dog dog(){ Dog dog = new Dog(); dog.setColor(dogProperties.getColor()); dog.setType(dogProperties.getType()); return dog; } } \`\`\` ## 4.自动配置原理 引入starter-web依赖后会自动装配DispatcherServlet到IOC容器 自动配置源码分析 \`\`\`java @SpringBootApplication \<------组合注解 public class App { public static void main( String\[\] args ) { SpringApplication.run(App.class, args); } } \`\`\` \`\`\`java @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration //标记当前是一个springboot的配置类 @EnableAutoConfiguration //开启自动配置 \<---------在进去 @ComponentScan( //扫描spring相关的注解 excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class} )} ) public @interface SpringBootApplication {} \`\`\` \`\`\`java @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import({AutoConfigurationImportSelector.class})//加载 自动配置选择器 \<---------在进去 public @interface EnableAutoConfiguration { } \`\`\` \`\`\`java public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered { //这个方法是DeferredImportSelector这个接口的方法 因此程序会自动执行selectImports方法 public String\[\] selectImports(AnnotationMetadata annotationMetadata) { if (!this.isEnabled(annotationMetadata)) {//是否开启自动装配-默认开启 return NO_IMPORTS; } else { // getAutoConfigurationEntry \<--------- 点击进去继续看 AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata); //返回的读取到的配置 return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations()); } } \`\`\` \`\`\`java protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) { if (!this.isEnabled(annotationMetadata)) { return EMPTY_ENTRY; } else { AnnotationAttributes attributes = this.getAttributes(annotationMetadata); //getCandidateConfigurations \<--------- 点击进去继续看 List configurations = this.getCandidateConfigurations(annotationMetadata, attributes); configurations = this.removeDuplicates(configurations); Set exclusions = this.getExclusions(annotationMetadata, attributes); this.checkExcludedClasses(configurations, exclusions); configurations.removeAll(exclusions); configurations = this.getConfigurationClassFilter().filter(configurations); this.fireAutoConfigurationImportEvents(configurations, exclusions); return new AutoConfigurationEntry(configurations, exclusions); } } \`\`\` \`\`\`java protected List getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) { ImportCandidates importCandidates = ImportCandidates.load(this.autoConfigurationAnnotation, this.getBeanClassLoader()); List configurations = importCandidates.getCandidates(); //如果数组为空抛出异常 Assert.state(!CollectionUtils.isEmpty(configurations), "No auto configuration classes found in META-INF/spring/" + this.autoConfigurationAnnotation.getName() + ".imports. If you are using a custom packaging, make sure that file is correct."); return configurations; } \`\`\` 通过断点查看(打断点后直接开服)完整的读取文件的位置在: META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports里 \*\*找对应该的文件spring-boot-autoconfigure-3.5.14.jar 这个里面\*\* \`\`\`java org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration org.springframework.boot.autoconfigure.aop.AopAutoConfiguration org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveDataAutoConfiguration org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveRepositoriesAutoConfiguration org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchClientAutoConfiguration org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration org.springframework.boot.autoconfigure.elasticsearch.ReactiveElasticsearchClientAutoConfiguration org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration org.springframework.boot.autoconfigure.graphql.GraphQlAutoConfiguration org.springframework.boot.autoconfigure.graphql.data.GraphQlQueryByExampleAutoConfiguration org.springframework.boot.autoconfigure.graphql.data.GraphQlQuerydslAutoConfiguration org.springframework.boot.autoconfigure.graphql.data.GraphQlReactiveQueryByExampleAutoConfiguration org.springframework.boot.autoconfigure.graphql.data.GraphQlReactiveQuerydslAutoConfiguration org.springframework.boot.autoconfigure.graphql.reactive.GraphQlWebFluxAutoConfiguration org.springframework.boot.autoconfigure.graphql.rsocket.GraphQlRSocketAutoConfiguration org.springframework.boot.autoconfigure.graphql.rsocket.RSocketGraphQlClientAutoConfiguration org.springframework.boot.autoconfigure.graphql.security.GraphQlWebFluxSecurityAutoConfiguration org.springframework.boot.autoconfigure.graphql.security.GraphQlWebMvcSecurityAutoConfiguration org.springframework.boot.autoconfigure.graphql.servlet.GraphQlWebMvcAutoConfiguration org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration org.springframework.boot.autoconfigure.http.client.HttpClientAutoConfiguration org.springframework.boot.autoconfigure.http.client.reactive.ClientHttpConnectorAutoConfiguration org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration org.springframework.boot.autoconfigure.jdbc.JdbcClientAutoConfiguration org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration org.springframework.boot.autoconfigure.netty.NettyAutoConfiguration org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration org.springframework.boot.autoconfigure.pulsar.PulsarAutoConfiguration org.springframework.boot.autoconfigure.pulsar.PulsarReactiveAutoConfiguration org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration org.springframework.boot.autoconfigure.r2dbc.R2dbcProxyAutoConfiguration org.springframework.boot.autoconfigure.r2dbc.R2dbcTransactionManagerAutoConfiguration org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration org.springframework.boot.autoconfigure.rsocket.RSocketRequesterAutoConfiguration org.springframework.boot.autoconfigure.rsocket.RSocketServerAutoConfiguration org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientAutoConfiguration org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientWebSecurityAutoConfiguration org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientWebSecurityAutoConfiguration org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration org.springframework.boot.autoconfigure.security.oauth2.server.servlet.OAuth2AuthorizationServerAutoConfiguration org.springframework.boot.autoconfigure.security.oauth2.server.servlet.OAuth2AuthorizationServerJwtAutoConfiguration org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration org.springframework.boot.autoconfigure.security.rsocket.RSocketSecurityAutoConfiguration org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration org.springframework.boot.autoconfigure.session.SessionAutoConfiguration org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizationAutoConfiguration org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.ReactiveMultipartAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.WebSessionIdResolverAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration // DispatcherServletAutoConfiguration 配置文件 org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration \`\`\` \`\`\`java @AutoConfigureOrder(Integer.MIN_VALUE) @AutoConfiguration( after = {ServletWebServerFactoryAutoConfiguration.class} ) @ConditionalOnWebApplication( type = Type.SERVLET ) @ConditionalOnClass({DispatcherServlet.class})//环境中有该类才会加载当前这个配置类 public class DispatcherServletAutoConfiguration {} \`\`\` \`\`\`java @Bean(name = {"dispatcherServlet"}) public DispatcherServlet dispatcherServlet(WebMvcProperties webMvcProperties) { DispatcherServlet dispatcherServlet = new DispatcherServlet(); dispatcherServlet.setDispatchOptionsRequest(webMvcProperties.isDispatchOptionsRequest()); dispatcherServlet.setDispatchTraceRequest(webMvcProperties.isDispatchTraceRequest()); dispatcherServlet.setPublishEvents(webMvcProperties.isPublishRequestHandledEvents()); dispatcherServlet.setEnableLoggingRequestDetails(webMvcProperties.isLogRequestDetails()); return dispatcherServlet; } \`\`\` 测试 \`\`\`java @SpringBootApplication @MapperScan("cn.woniu.mapper") public class App { public static void main( String\[\] args ) { ConfigurableApplicationContext run = SpringApplication.run(App.class, args); System.out.println(run.getBean(DispatcherServlet.class)); } } \`\`\` ## 5.自定义start 规则: springboot把场景启动器分为两部分: 1 启动器模块(starter):是一个空的jar文件,,仅提供依赖管理(pom.xml),需要依赖自动装配模块----负责"提供什么" 2 自动配置模块(XxxAutoConfiguration), 包含自动配置的代码逻辑,是功能实现层,负责"怎么做" (我们以后只需要去依赖该启动器,而启动器依赖自动配置) 分离成两个模块原因: 1 职责分离,清晰明确 2 便于依赖管理和版本控制 3 灵活 ### 1.命名: 官方命名:spring-boot-starter-\* : 比如spring-boot-starter-\*web 自定义命名:\*-spring-boot-starter 比如 myxx-spring-boot-starter ### 2.定义一个starter,通过配置可以获取信息 步骤: #### 1新建mybean-spring-boot-autoconfigure模块 #### 2.导包 \`\`\`java org.springframework.boot spring-boot-starter \`\`\` #### 3.创建一个UserProperties类 \`\`\` @ConfigurationProperties(prefix = "user") @Data public class UserProperties { private String username; private String password; } \`\`\` #### 4.创建一个UserAutoConfig类 \`\`\`java @Configuration @EnableConfigurationProperties(UserProperties.class) public class UserAutoConfig { @Autowired private UserProperties userProperties; @Bean @ConditionalOnProperty(prefix = "user", value = {"username","password"}) public UserTemplate getUserTemplate(){ UserTemplate userTemplate = new UserTemplate(); userTemplate.setUsername(userProperties.getUsername()); userTemplate.setPassword(userProperties.getPassword()); return userTemplate; } } \`\`\` \`\`\`java @Data public class UserTemplate { private String username; private String password; } \`\`\` application.yml 配置 \`\`\`yml user: username: 张三 passowrd: 123456 \`\`\` #### 5.在resource目录下面创建 配置上自己的类 META-INF spring org.springframework.boot.autoconfigure.AutoConfiguration.imports \`\`\`java cn.woniu.springboot.start.UserAutoConfig \`\`\` #### 6.通过maven打包安装到本地 install #### 7.创建一个mybean-spring-boot-starter 只需要引入上面的mybean-spring-boot-autoconfigure依赖 \`\`\` cn.woniu mybean-spring-boot-autoconfigure 1.0-SNAPSHOT \`\`\` #### 8.最后在将mybean-spring-boot-starter安装到本地 install #### 9.最后目标项目就可以直接引入mybean-spring-boot-starter依赖进行使用
06_springboot自定义start
https://xiaochenblog.icu/archives/88b3f233-c20a-4fdc-a5ea-10ff728a8fb2
评论