Spring Boot SSM整合
一、Spring Boot整合Web开发
1.默认静态资源配置
WebMvcAutoConfiguration该类下找到属性:ResourceProperties进入可查看到: Spring Boot 默认将 /** 所有访问映射到以下目录:?
classpath:/static
classpath:/public
classpath:/resources
classpath:/META-INF/resources
如:在src/main/resources目录下新建 public、resources、static 三个目录,并分别放入 a.jpg b.jpg c.jpg 图片
均能正常访问相应的图片资源。那么说明,Spring Boot 默认会挨个从 public resources static 里面找是否存在相应的资源,如果有则直接返回。
2.在application配置
在application.properties中添加配置:
注意:通过spring.mvc.static-path-pattern这种方式配置,会使Spring Boot的默认配置失效,也就是说,/public /resources 等默认配置不能使用。 配置中配置了静态模式为/static/,就只能通过/static/来访问。
spring:
mvc:
static-path-pattern: /static/**
3. 配置主页面
WebMvcAutoConfiguration:默认:index.html
在静态资源下 public、resources、static可直接访问
@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext) {
return new WelcomePageHandlerMapping(new TemplateAvailabilityProviders(applicationContext),
applicationContext, getWelcomePage(), this.mvcProperties.getStaticPathPattern());
}
二、SpringBoot多环境配置
引言
我们在开发Spring Boot应用时,通常同一套程序会被应用和安装到几个不同的环境,比如:开发、测试、生产等。其中每个环境的数据库地址、服务器端口等等配置都会不同,如果在为不同环境打包时都要频繁修改配置文件的话,那必将是个非常繁琐且容易发生错误的事。
语法结构
在Spring Boot中多环境配置文件名需要满足application-{profile}.yml的格式
其中{profile}对应你的环境标识,比如:
application-dev.yml:开发环境
application-test.yml:测试环境
application-prod.yml:生产环境
示例
#分别创建
- application.yml #默认环境
- application-dev.yml: #开发环境 localhost
- application-test.yml:#测试环境 test-server
- application-prod.yml:#生产环境 阿里云/腾讯云
不同进行测试。默认只会进入application.yml。
至于哪个具体的配置文件会被加载,需要在application.yml文件中通过spring.profiles.active属性来设置,其值对应{profile}值。
spring:
? profiles:
? ? active: dev
启动项目指定环境
启动打包的jar包时,可能使用的是 java -jar myjavaapp.jar来启动项目,如果我们需要制定特定的环境启动只需要加上一个启动属性即可轻松完成一个jar在不同环境通用的效果 ? java -jar myapp.jar --spring.profiles.active=dev
总结
application.yml中配置通用内容,并设置spring.profiles.active=dev,以开发环境为默认配置
application-{profile}.yml中配置各个环境不同的内容
三、SpringBoot整合MyBatis
1、新建SpringBoot工程
2、POM.XML SSM
<dependencies>
<!-- spring web mvc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- spring mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<!-- mysql 驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- druid 数据源连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
3、bean代码
@Data
public class User {
private Integer id;
private String name;
private String telphone;
private Integer status;
}
4、mapper代码
@Mapper //MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring DAO接口所在包名,Spring会自动查找其下的类
public interface UserMapper {
List<User> selectAll();
........
}
5、application.yml配置
server:
port: 8080
spring:
#数据源连接配置
datasource:
name: test
type: com.alibaba.druid.pool.DruidDataSource
druid: #druid相关配置
url: jdbc:mysql://localhost:3306/exam
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 6666
#监控统计拦截的filters
filters: stat
#配置初始化大小/最小/最大
initial-size: 1
min-idle: 1
max-active: 20
#获取连接等待超时时间
max-wait: 60000
#间隔多久进行一次检测,检测需要关闭的空闲连接
time-between-eviction-runs-millis: 60000
#一个连接在池中最小生存的时间
min-evictable-idle-time-millis: 300000
validation-query: SELECT 'x'
test-while-idle: true
test-on-borrow: false
test-on-return: false
#打开PSCache,并指定每个连接上PSCache的大小。oracle设为true,mysql设为false。分库分表较多推荐设置为false
pool-prepared-statements: false
max-pool-prepared-statement-per-connection-size: 20
#整合myBatis
mybatis:
mapper-locations: classpath:mapper/*.xml # mapper映射对应的配置文件位置.xml
type-aliases-package: com.qw.bean # 对应的实体类的包名
configuration:
map-underscore-to-camel-case: true #字段名下划线和实体类驼峰命名的属性名对应
6、启动类 Application
注意:@MapperScan(value="com.qw.mapper") 或接口上@Mapper各选一个
@SpringBootApplication
@MapperScan(value = "com.qw.mapper")
public class Boot2SsmApplication {
public static void main(String[] args) {
SpringApplication.run(Boot2SsmApplication.class, args);
}
}
7、异常注意事项
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
2019-07-24 19:24:52.225 ERROR 8704 --- [ restartedMain] com.alibaba.druid.pool.DruidDataSource : init datasource error, url: jdbc:mysql://localhost:3306/maven_ssm
java.sql.SQLException: The server time zone value '���??��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if
.................
使用Idea做jdbc的时候用了最新的mysql-connector-java-8.0.11库发现编码没有异常但是运行时出现了两个异常,如下
意思是 mysql.jdbc.driver被弃用了新的驱动类是“com.mysql.cjdbc.driver”。驱动程序通过SPI自动注册,而手动加载类通常是不必要的,解决方案如下:
把com.mysql.jdbc.Driver 改为com.mysql.cj.jdbc.Driver 即可
第二个异常是时区的错误,因此只你需要设置为你当前系统时区即可
?serverTimezone=GMT%2B8
完整如下:
#数据源连接配置
datasource:
name: test
type: com.alibaba.druid.pool.DruidDataSource
druid: #druid相关配置
url: jdbc:mysql://localhost:3306/exam?serverTimezone=GMT%2B8
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 6666
四、SpringBoot SSM整合总结
<dependencies>
<!-- spring web mvc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- spring mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<!-- mysql 驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!-- druid 数据源连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
application.yml
server:
port: 8080
spring:
#数据源连接配置
datasource:
name: test
type: com.alibaba.druid.pool.DruidDataSource
druid: #druid相关配置
url: jdbc:mysql://localhost:3306/exam?serverTimezone=GMT%2B8
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 6666
#监控统计拦截的filters
filters: stat
#配置初始化大小/最小/最大
initial-size: 1
min-idle: 1
max-active: 20
#获取连接等待超时时间
max-wait: 60000
#间隔多久进行一次检测,检测需要关闭的空闲连接
time-between-eviction-runs-millis: 60000
#一个连接在池中最小生存的时间
min-evictable-idle-time-millis: 300000
validation-query: SELECT 'x'
test-while-idle: true
test-on-borrow: false
test-on-return: false
#打开PSCache,并指定每个连接上PSCache的大小。oracle设为true,mysql设为false。分库分表较多推荐设置为false
pool-prepared-statements: false
max-pool-prepared-statement-per-connection-size: 20
#整合myBatis
mybatis:
mapper-locations: classpath:mapper/*.xml # mapper映射对应的配置文件位置.xml
type-aliases-package: com.qw.entity.po # 对应的实体类的包名
五、自动装配流程
@SptingBootApplication这个注解是暴露给用户使用的一个入口,它的底层其实是由@EnableAutoConfiguration这个注解来实现的
一、集成(启动)依赖组件
jar包命名规范包含:spring-boot-starter
二、SpringBoot会采用SPI机制,按约定扫描出在 /META-INF/目录下spring.factories文件,(解析其中的键值 获取所有依赖的配置类 再根据order 排序加入spring 容器中 既可以完成)。然后SpringBoot会自动根据约定,自动使用SpringFactoriesLoader来加载配置文件中的内容
三、Spring获取到第三方jar中的配置以后会调用ImportSelector接口来完成动态加载,组件中类上方必须要包含@Configuration的配置类,在这个配置类里面声明为Bean注解,然后将方法的返回值或者是属性注入到IOC容器中,即完成自动整合配置。
Spring SPI
SPI(Service Provider Interface)服务提供接口,简单来说就是用来解耦,实现插件的自由插拔,
Spring的SPI文件是有规定的,它需要放在工程的META-INF下,且文件名必须为spring.factories,
Spring的SPI加载spring.factories文件的操作是使用SpringFactoriesLoader,SpringFactoriesLoader它不仅可以加载声明的类的对象,而且可以直接把预先定义好的全限定名都取出来;
通过类加载器获取类路径下的FACTORIES_RESOURCE_LOCATION,之后获取到的资源路径,以properties的方式解析配置文件,其中配置文件的key为声明的类型,value为具体的实现的列表,最后将结果添加到缓存,其中缓存的key为类加载器,value为配置文件的内容;
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!