活动地址:优快云21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
想系统/深入学习某技术知识点…
一个人摸索学习很难坚持,想组团高效学习…
想写博客但无从下手,急需写作干货注入能量…
热爱写作,愿意让自己成为更好的人…
…
1.1、SpringBoot
SpringBoot 是一个快速开发的框架, 封装了Maven常用依赖、能够快速的整合第三方框架;简化XML配置,全部采用注解形式,内置Tomcat、Jetty、Undertow,帮助开发者能够实现快速开发,SpringBoot的Web组件 默认集成的是SpringMVC框架。
SpringBoot原理介绍:
-
能够帮助开发者实现快速整合第三方框架 (原理:Maven依赖封装)
-
去除xml配置 完全采用注解化 (原理:Spring体系中内置注解方式)
-
无需外部Tomcat、内部实现服务器(原理:Java语言支持内嵌入Tomcat服务器)
1.2、SpringBoot和SpringMVC区别
SpringBoot 是一个快速开发的框架,能够快速的整合第三方框架,简化XML配置,全部采用注解形式,内置Tomcat容器,帮助开发者能够实现快速开发,SpringBoot的Web组件 默认集成的是SpringMVC框架。
SpringMVC是控制层。
1.3、SpringBoot和SpringCloud区别
SpringBoot 是一个快速开发的框架,能够快速的整合第三方框架,简化XML配置,全部采用注解形式,内置Tomcat容器,帮助开发者能够实现快速开发,SpringBoot的Web组件 默认集成的是SpringMVC框架。
SpringMVC是控制层。
SpringCloud依赖与SpringBoot组件,使用SpringMVC编写Http协议接口,同时SpringCloud是一套完整的微服务解决框架。
二、快速入门
2.1、创建一个Maven工程
名为”springboot-helloworld”类型为Jar工程项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eTAhtiXo-1659368846122)(file:///C:\Users\86184\AppData\Local\Temp\ksohtml15504\wps1.jpg)]
2.2、pom文件引入依赖
org.springframework.boot spring-boot-starter-parent 2.1.8.RELEASE org.springframework.boot spring-boot-starter-webspring-boot-starter-parent作用
在pom.xml中引入spring-boot-start-parent,spring官方的解释叫什么stater poms,它可以提供dependency management,也就是说依赖管理,引入以后在申明其它dependency的时候就不需要version了,后面可以看到。
spring-boot-starter-web作用
springweb 核心组件
2.3、编写HelloWorld服务
创建package命名为com.mayikt.controller(根据实际情况修改)创建HelloController类,内容如下
@RestController
@EnableAutoConfiguration
public class HelloController {
@RequestMapping(“/hello”)
public String index() {
return “Hello World”;
}
public static void main(String[] args) {
SpringApplication.run(HelloController.class, args);
}
}
2.4、@RestController
在上加上RestController 表示修饰该Controller所有的方法返回JSON格式,直接可以编写
Restful接口
注意该注解是SpringMVC提供的哦!
2.5@EnableAutoConfiguration
注解:作用在于让 Spring Boot 根据应用所声明的依赖来对 Spring 框架进行自动配置
这个注解告诉Spring Boot根据添加的jar依赖猜测你想如何配置Spring。由于spring-boot-starter-web添加了Tomcat和Spring MVC,所以auto-configuration将假定你正在开发一个web应用并相应地对Spring进行设置。
2.6、SpringApplication.run(HelloController.class, args);
标识为启动类
2.7、SpringBoot启动方式1
Springboot默认端口号为8080
@RestController
@EnableAutoConfiguration
public class HelloController {
@RequestMapping(“/hello”)
public String index() {
return “Hello World”;
}
public static void main(String[] args) {
SpringApplication.run(HelloController.class, args);
}
}
启动主程序,打开浏览器访问http://localhost:8080/index,可以看到页面输出Hello World
2.8、SpringBoot启动方式2
@ComponentScan(basePackages = “com.mayikt.controller”)—控制器扫包范围
@ComponentScan(basePackages = “com.mayikt.controller”)
@EnableAutoConfiguration
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
2.9、SpringBoot启动方式3
@SpringBootApplication
@SpringBootApplication 被 @Configuration、@EnableAutoConfiguration、@ComponentScan 注解所修饰,换言之 Springboot 提供了统一的注解来替代以上三个注解
扫包范围:在启动类上加上@SpringBootApplication注解,当前包下或者子包下所有的类都可以扫到。
三、Web开发
3.1、静态资源访问
在我们开发Web应用的时候,需要引用大量的js、css、图片等静态资源。
默认配置
Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则:
/static
/public
/resources
/META-INF/resources
举例:我们可以在src/main/resources/目录下创建static,在该位置放置一个图片文件。启动程序后,尝试访问http://localhost:8080/D.jpg。如能显示图片,配置成功。
微服务项目
前后端分离
前端----vue----前端工程师
后端—springboot–后端工程师
动静分离 部署cdn上
Cdn 减少带宽距离传输 减少自己服务器带宽;
3.2、渲染Web页面
Com.mayikt.controller—视图层 渲染我们页面
Com.mayikt.service—业务逻辑层
Com.mayikt.dao—数据库访问层
前后端
渲染Web页面
在之前的示例中,我们都是通过@RestController来处理请求,所以返回的内容为json对象。那么如果需要渲染html页面的时候,要如何实现呢?
模板引擎 能够非常好的帮助seo搜索到该网页
在动态HTML实现上Spring Boot依然可以完美胜任,并且提供了多种模板引擎的默认配置支持,所以在推荐的模板引擎下,我们可以很快的上手开发动态网站。
Spring Boot提供了默认配置的模板引擎主要有以下几种:
Thymeleaf
FreeMarker
Velocity
Groovy
Mustache
Spring Boot建议使用这些模板引擎,避免使用JSP,若一定要使用JSP将无法实现Spring Boot的多种特性,具体可见后文:支持JSP的配置
当你使用上述模板引擎中的任何一个,它们默认的模板配置路径为:src/main/resources/templates。当然也可以修改这个路径,具体如何修改,可在后续各模板引擎的配置属性中查询并修改。
3.3、YML与Properties用法
SpringBoot支持两种配置方式,一种是properties文件,一种是yml。
使用yml可以减少配置文件的重复性。
例如:application.properties配置
mayikt.name=mayikt
mayikt.age=22
例如:application.yml配置
在企业中application.yml方式用的是比较多的;
3.4、使用Freemarker模板引擎渲染web视图
3.4.1、pom文件引入:
org.springframework.boot
spring-boot-starter-freemarker
3.4.2、后台代码
在src/main/resources/创建一个templates文件夹,后缀为*.ftl。
@RequestMapping(“/index”)
public String index(Map<String, Object> map) {
map.put(“name”,“每特”);
return “index”;
}
3.4.3、前台代码
3.4.4、Freemarker其他用法
@RequestMapping(“/freemarkerIndex”)
public String index(Map<String, Object> result) {
result.put(“name”, “yushengjun”);
result.put(“sex”, “0”);
List listResult = new ArrayList();
listResult.add(“zhangsan”);
listResult.add(“lisi”);
listResult.add(“mayikt”);
result.put(“listResult”, listResult);
return “index”;
}
</#if>
<#list userlist as user>
${user}
</#list>
两种方法
1 用符号代替: > gt , >= gte ,< lt , <= lte
2 加括号 <#if(x>y)>
3.4.5、Freemarker配置
新建application.yml文件
spring:
http:
encoding:
force: true
模版引擎编码为UTF-8
charset: UTF-8
freemarker:
allow-request-override: false
cache: false
check-template-location: true
charset: UTF-8
content-type: text/html; charset=utf-8
expose-request-attributes: false
expose-session-attributes: false
expose-spring-macro-helpers: false
模版文件结尾.ftl
suffix: .ftl
模版文件目录
template-loader-path: classpath:/templates
3.5使用thymeleaf渲染Web页面
3.5.1什么是thymeleaf
thymeleaf是一款用于渲染XML/XHTML/HTML5内容的模板引擎,类似JSP,Velocity,FreeMaker等,它也可以轻易的与Spring MVC等Web框架进行集成作为Web应用的模板引擎。
3.5.2 Maven依赖
org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-thymeleaf3.5.3 配置文件新增
###ThymeLeaf配置
spring:
thymeleaf:
#prefix:指定模板所在的目录
prefix: classpath:/templates/
#check-tempate-location: 检查模板路径是否存在
check-template-location: true
#cache: 是否缓存,开发模式下设置为false,避免改了模板还要重启服务器,线上设置为true,可以提高性能。
cache: true
suffix: .html
encoding: UTF-8
mode: HTML5
3.5.4 案例代码
import com.mayikt.entity.UserEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Map;
/**
- @ClassName IndexController
- @Author 蚂蚁课堂余胜军 QQ644064779 www.mayikt.com
- @Version V1.0
**/
@Controller
public class IndexController {
@RequestMapping(“/myThymeleaf”)
public String myThymeleaf(Map<String, Object> result) {
result.put(“user”, new UserEntity(“mayikt”, 22));
return “myThymeleaf”;
}
}
/**
-
@ClassName UserEntity
-
@Author 蚂蚁课堂余胜军 QQ644064779 www.mayikt.com
-
@Version V1.0
**/
public class UserEntity {
private String userName;
private Integer age;public UserEntity(String userName, Integer age) {
this.userName = userName;
this.age = age;
}public String getUserName() {
return userName;
}public Integer getAge() {
return age;
}public void setUserName(String userName) {
this.userName = userName;
}public void setAge(Integer age) {
this.age = age;
}
}
3.5.4 高级写法
循环语句:
If判断:
已经成年啦
未成年
详细可以更多语法可以查看https://www.thymeleaf.org/documentation.html
四、数据库访问
4.1、springboot整合使用JdbcTemplate
4.1.1 pom文件引入
org.springframework.boot spring-boot-starter-parent 2.1.8.RELEASE org.springframework.boot spring-boot-starter-jdbc mysql mysql-connector-java 5.1.21 org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-starter-web4.1.2 application.yml新增配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
4.1.3 UserService类
@Service
public class UserServiceImpl implements UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public Boolean inserUser(String name, Integer age) {
int update = jdbcTemplate.update("insert into users values(null,?,?);", name, age);
return update > 0 ? true : false;
}
}
4.1.4 App类
@ComponentScan(basePackages = “com.mayikt”)
@EnableAutoConfiguration
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
4.1.5数据库表结构
CREATE TABLE users
(
id
int(11) NOT NULL AUTO_INCREMENT,
name
varchar(32) NOT NULL COMMENT ‘用户名称’,
age
int(11) DEFAULT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
4.2、springboot整合使用mybatis
4.2.1、pom文件引入
org.springframework.boot spring-boot-starter-parent 2.1.8.RELEASE org.springframework.boot spring-boot-starter-web org.mybatis.spring.boot mybatis-spring-boot-starter 1.1.1 mysql mysql-connector-java 5.1.214.2.2、application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
4.2.3、Mapper代码
public interface UserMapper {
@Select(“SELECT * FROM USERS WHERE NAME = #{name}”)
User findByName(@Param(“name”) String name);
@Insert(“INSERT INTO USERS(NAME, AGE) VALUES(#{name}, #{age})”)
int insert(@Param(“name”) String name, @Param(“age”) Integer age);
}
4.2.4、启动方式
@SpringBootApplication
@MapperScan(“com.mayikt.mapper”)
public class AppMybatis {
public static void main(String[] args) {
SpringApplication.run(AppMybatis.class);
}
}
4.3、springboot整合多数据源
4.4.1配置文件中新增两个数据源
application.yml
spring:
datasource:
###会员数据库
member:
jdbc-url: jdbc:mysql://localhost:3306/user
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
###订单数据库
order:
jdbc-url: jdbc:mysql://localhost:3306/order
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
备注:如果是SpringBoot2配置多数据源 ,报如下错误:
“jdbcUrl is required with driverClassName.”或者Cause: java.lang.IllegalArgumentException: dataSource or dataSourceClassName or jdbcUrl is required.] with root cause
解决方案:
spring.datasource.url 和spring.datasource.driverClassName,换成
spring.datasource.jdbc-url和spring.datasource.driver-class-name
4.4.2数据库数据源相关配置
会员数据源
@Configuration
@MapperScan(basePackages = “com.mayikt.member.mapper”, sqlSessionFactoryRef = “memberSqlSessionFactory”)
public class MemberDataSourceConfig {
/**
* 将会员db注册到容器中
*
* @return
*/
@Bean(name = "memberDataSource")
@ConfigurationProperties(prefix = "spring.datasource.member")
public DataSource memberDataSource() {
return DataSourceBuilder.create().build();
}
/**
* 将会员SqlSessionFactory注册到容器中
*
* @param dataSource
* @return
* @throws Exception
*/
@Bean(name = "memberSqlSessionFactory")
public SqlSessionFactory memberSqlSessionFactory(@Qualifier("memberDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(memberDataSource());
return sqlSessionFactoryBean.getObject();
}
/**
* 创建会员管理器
*
* @param dataSource
* @return
*/
@Bean(name = "memberTransactionManager")
public DataSourceTransactionManager memberTransactionManager(@Qualifier("memberDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
/**
* 创建订单sqlSesion模版
*
* @param sqlSessionFactory
* @return
* @throws Exception
*/
@Bean(name = "memberSqlSessionTemplate")
public SqlSessionTemplate menberSqlSessionTemplate(
@Qualifier("memberSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
订单数据源
@Configuration
@MapperScan(basePackages = “com.mayikt.order.mapper”, sqlSessionFactoryRef = “orderSqlSessionFactory”)
public class OrderDataSourceConfig {
/**
* 将订单db注册到容器中
*
* @return
*/
@Bean(name = "orderDataSource")
@ConfigurationProperties(prefix = "spring.datasource.order")
public DataSource orderDataSource() {
return DataSourceBuilder.create().build();
}
/**
* 将订单SqlSessionFactory注册到容器中
*
* @param dataSource
* @return
* @throws Exception
*/
@Bean(name = "orderSqlSessionFactory")
public SqlSessionFactory orderSqlSessionFactory(@Qualifier("orderDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(orderDataSource());
return sqlSessionFactoryBean.getObject();
}
/**
* 创建订单管理器
*
* @param dataSource
* @return
*/
@Bean(name = "orderTransactionManager")
public DataSourceTransactionManager orderTransactionManager(@Qualifier("orderDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
/**
* 创建订单sqlSesion模版
*
* @param sqlSessionFactory
* @return
* @throws Exception
*/
@Bean(name = "orderSqlSessionTemplate")
public SqlSessionTemplate menberSqlSessionTemplate(
@Qualifier("orderSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
4.4.3创建分包Mapper
会员mapper
public interface MemberMapper {
@Insert(“insert into users values(null,#{name},#{age});”)
public int addUser(@Param(“name”) String name, @Param(“age”) Integer age);
}
订单mapper
public interface OrderMapper {
@Insert(“insert into order_number values(null,#{number});”)
int inserOrder(@Param(“number”) String number);
}
五、事务管理
5.1.1Springboot整合事务管理
springboot默认集成事务,只主要在方法上加上@Transactional即可
5.1.2SpringBoot分布式事务管理
使用springboot+jta+atomikos 分布式事物Transactional管理