前言
spring作为主流的 Java Web 开发的开源框架,是Java 世界最为成功的框架,持续不断深入认识spring框架是Java程序员不变的追求。
本篇博客介绍SpringBootApplicant注解的自动加载相关内容
其他相关的Spring博客文章列表如下:
Spring基础(核心容器)——从配置文件到注解开发 & 创建对象+成员变量赋值IOC & 增强方法AOP
Spring进阶(AOP的理解)——静态/动态代理 & 面向切面编程AOP(Aspect Oriented Programming) & 日志记录 & 增强方法
Spring进阶(AOP的应用)—— 动态代理AOP后controller层的private方法访问失效的问题
Spring基础(Web-MVC)——在idea中新建springWeb项目 & 浏览器请求 和 服务器响应 & SpringMvc文件相关
SpringMvc框架——【深入】SpringMVC 的运行流程:从客户端发送请求request到springMvc框架返回响应response的全流程分析 & DispatcherServlet
SpringBoot基础——追根溯源servlet是啥,tomcat是啥,maven是啥 & springBoot项目初步,maven构建,打包 & 测试
目录
- 前言
- 引出
- mybatis相关包导入没写配置
- 1.@SpringBootApplication注解
- 2.如果没有写url等相关配置
- 分布式架构下如何加载其他模块的类
- 1.单体架构的一般模式
- 2.分布式架构的模式
- 另一种方式:设置自动装配
- 问题:使用nacos的时候怎么发现的?
- 总结
引出
1.mybatis相关包导入没写配置,@SpringBootApplication注解加入排除自动装配的相关内容;
2.在分布式架构下,如果某个模块想要其他模块下的类,需要加入@ComponentScan(basePackages = “com.tianju.domain”)进行包的扫描;
3.如果不加包扫描的注解,则需要在想要被注入到spring容器中的模块的resource下,即根目录下新建文件夹META-INF,新建文件spring.factories,写相关内容;
mybatis相关包导入没写配置
1.@SpringBootApplication注解
2.如果没有写url等相关配置
导入了mysql,mybatis,druid的依赖,但是application.yml文件中没有写相关的数据源url等的配置
此时,需要在注解@SpringBootApplication中加入排除自动装配的相关内容;加入排除后,再次启动项目,不再报错。
package com.tianju;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
@SpringBootApplication(exclude =
{DruidDataSourceAutoConfigure.class,
DataSourceAutoConfiguration.class}
)
public class TestApp {
public static void main(String[] args) {
SpringApplication.run(TestApp.class);
}
}
分布式架构下如何加载其他模块的类
mybatisplus使用分页插件,拦截器策略,在在一个引入位置写拦截器,其它模块引入配置类,需要使用@ComponentScan(base="配置类所在的包)
1.单体架构的一般模式
package com.tinaju.bm.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 分页需要加一个拦截器
*/
@Configuration
public class MybatisPlusConfig {
@Bean // 放到容器中
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
paginationInnerInterceptor.setDbType(DbType.MYSQL);
paginationInnerInterceptor.setOverflow(true);
mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor);
return mybatisPlusInterceptor;
}
}
在单体模式下,会自动扫描主启动类同级下面的注解,就扫描到了标了注解的@Configuration 的分页拦截器
2.分布式架构的模式
在分布式架构下,如果某个模块想要其他模块下的类,需要加入@ComponentScan(basePackages = “com.tianju.domain”)进行包的扫描
package com.tianju.smovie.genre;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@SpringBootApplication
@EnableDiscoveryClient
//@EnableJpaRepositories // 不加会报错 Not a managed type: class com.tianju.domain.entity.Genre
@EntityScan(basePackages = "com.tianju.domain.entity") // TODO:jpa需要加这个
@ComponentScan(basePackages = "com.tianju.domain")
public class GenreApp {
public static void main(String[] args) {
SpringApplication.run(GenreApp.class);
}
}
如果不加的话,就不会加载到容器中
另一种方式:设置自动装配
如果不加上面包扫描的注解,则需要在想要被注入到spring容器中的模块的resource下,即根目录下新建文件夹META-INF,新建文件spring.factories,写相关内容。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.tianju.domain.config.MybatisPlusConfig
排除在外相关
问题:使用nacos的时候怎么发现的?
如下图所示,nacos里面就有文件夹META-INF,下面有个文件spring.factories,里面的东西就会被加载进来
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration,\
com.alibaba.cloud.nacos.endpoint.NacosDiscoveryEndpointAutoConfiguration,\
com.alibaba.cloud.nacos.registry.NacosServiceRegistryAutoConfiguration,\
com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration,\
com.alibaba.cloud.nacos.discovery.reactive.NacosReactiveDiscoveryClientConfiguration,\
com.alibaba.cloud.nacos.discovery.configclient.NacosConfigServerAutoConfiguration,\
com.alibaba.cloud.nacos.loadbalancer.LoadBalancerNacosAutoConfiguration,\
com.alibaba.cloud.nacos.NacosServiceAutoConfiguration,\
com.alibaba.cloud.nacos.util.UtilIPv6AutoConfiguration
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.alibaba.cloud.nacos.discovery.configclient.NacosDiscoveryClientConfigServiceBootstrapConfiguration
org.springframework.boot.SpringApplicationRunListener=\
com.alibaba.cloud.nacos.logging.NacosLoggingAppRunListener
总结
1.mybatis相关包导入没写配置,@SpringBootApplication注解加入排除自动装配的相关内容;
2.在分布式架构下,如果某个模块想要其他模块下的类,需要加入@ComponentScan(basePackages = “com.tianju.domain”)进行包的扫描;
3.如果不加包扫描的注解,则需要在想要被注入到spring容器中的模块的resource下,即根目录下新建文件夹META-INF,新建文件spring.factories,写相关内容;