Projects ==》Spring Boot ==》LEARN ==》版本相对应文档 Reference Doc ==> Spring Boot | 2.6.4 Documentation Overview
Maven pom.xml 配置
初始配置
1、依赖
pom.xml
<!--spring boot 版本-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
<!-- web环境-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!-- 简化部署 创建一个可执行的jar包-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2、创建主程序
MainApplication
/**
* 主程序类
* @SpringBootApplication 这是一个springBoot应用
*/
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class,args);
}
}
3、编写业务
Controller
//@ResponseBody
//@Controller
@RestController
public class HelloController {
@RequestMapping("/hello")
public String handle01(){
return "Hello Spring Boot 2!";
}
}
4、测试
直接运行main方法
5、简化配置
resources ==> application.properties
配置项见官方配置:Common Application Properties (spring.io)
6、简化部署
xml文件中引入插件
<!-- 简化部署 创建一个可执行的jar包-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
7、直接把项目打包成jar包,直接在目标服务器执行即可
依赖管理
maven 仓库 版本 地址 :Maven Repository: Search/Browse/Explore (mvnrepository.com)
注解信息
@Bean
@ConditionalOnBean
条件装配 当运行时 容器中有指定Bean时 装配注解下的配置 否则不装配
注意:在spring ioc
的过程中,优先解析@Component,@Service,@Controller
注解的类。其次解析配置类,也就是@Configuration
标注的类。最后开始解析配置类中定义的bean
。所以在使用@ConditionalOnBean
时需要注意解析顺序时IOC容器中是否有条件 组件
在配置类中定义Bean
,如果使用@ConditionalOnBean
注解依赖的Bean
是通过配置类触发解析的,则执行结果依赖配置类加载顺序
@RestController
Spring4之后新加入的注解,原来返回json需要@ResponseBody和@Controller配合。
即@RestController是@ResponseBody和@Controller的组合注解。
@ConfigurationProperties
http://t.csdn.cn/Dg3km
@Autowired
首先要知道另一个东西,default-autowire,它是在xml文件中进行配置的,可以设置为byName、byType、constructor和autodetect;比如byName,不用显式的在bean中写出依赖的对象,它会自动的匹配其它bean中id名与本bean的set**相同的,并自动装载。
@Autowired是用在JavaBean中的注解,通过byType形式,用来给指定的字段或方法注入所需的外部资源。
先看一下bean实例化和@Autowired装配过程:
一切都是从bean工厂的getBean方法开始的,一旦该方法调用总会返回一个bean实例,无论当前是否存在,不存在就实例化一个并装配,否则直接返回。(Spring MVC是在什么时候开始执行bean的实例化过程的呢?其实就在组件扫描完成之后)实例化和装配过程中会多次递归调用getBean方法来解决类之间的依赖。
Spring几乎考虑了所有可能性,所以方法特别复杂但完整有条理。
@Autowired最终是根据类型来查找和装配元素的,但是我们设置了后会影响最终的类型匹配查找。因为在前面有根据BeanDefinition的autowire类型设置PropertyValue值得一步,其中会有新实例的创建和注册。就是那个autowireByName方法。
下面通过@Autowired来说明一下用法Setter 方法中的 @Autowired
你可以在 JavaBean中的 setter 方法中使用 @Autowired 注解。当 Spring遇到一个在 setter 方法中使用的 @Autowired 注解,它会在方法中执行 byType 自动装配。
@ResponseBody
@ResponseBody的作用其实是将java对象转为json格式的数据。
@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。
注意:在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
@ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】。
注意:在使用 @RequestMapping后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。@RequestBody 将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。
这里不建议放到全局,会影响转发,导致转发无效 刚刚想省一点东西提到了最上面
开发小技巧
4.1、Lonbok
简化JavaBean开发
<!--编译时生成get,set-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
装这个插件
在实体类上加上@Data注解
异常信息
Process terminated
解决方法:
请求异常
400
启动异常
Caused by: java.nio.charset.MalformedInputException: Input length = 1
报错原因
1、编码格式问题
解决办法:
1、复制yml配置里面的内容,删除yml文件然后重新粘贴进文本里面
2、修改idea编码集,如下图所示:
3、这一块我修改之后还是报错,然后把yaml文件删除了,重新创建了给yml文件,修改字符编码就行了,不知道和文件后缀有没有关系
启动异常2
org.springframework.boot.devtools.restart.classloader.RestartClassLoader - Created RestartClassLoader org.springframework.boot.devtools.restart.classloader.RestartClassLoader@59114f16
yaml文件问题删了重新建就好了
启动异常3
异常信息
Exception in thread “main” java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
pom.xml文件配置
注意后引用的配置 最好放在后面 在Spring boot 依赖之后再引用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
矩阵变量开启后还是报404
在请求上加个@ResponseBody注解
WEB
静态资源目录
只要静态资源放在类路径下: called /static
(or /public
or /resources
or /META-INF/resources
访问 : 当前项目根路径/ + 静态资源名
原理: 静态映射/**。
请求进来,先去找Controller看能不能处理。不能处理的所有请求又都交给静态资源处理器。静态资源也找不到则响应404页面
WebJars
WebJars - Web Libraries in Jars
将web的js,css弄成Jar包然后通过依赖引入
自动映射
#设置静态资源前缀
spring:
mvc:
static-path-pattern: /res/**
#定义静态资源文件夹(全部由一个文件夹接管)
web:
resources:
static-locations: classpath:/haha/
使用第三方模板引擎thymeleaf
官网:Thymeleaf
1、引入thymeleaf
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2、自动配置thymeleaf
找到 ThymeleafAutoConfiguration
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(ThymeleafProperties.class)
@ConditionalOnClass({ TemplateMode.class, SpringTemplateEngine.class })
@AutoConfigureAfter({ WebMvcAutoConfiguration.class, WebFluxAutoConfiguration.class })
public class ThymeleafAutoConfiguration {}
//注入一个解析器
@Bean
SpringResourceTemplateResolver defaultTemplateResolver() {
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setApplicationContext(this.applicationContext);
resolver.setPrefix(this.properties.getPrefix());//前缀
resolver.setSuffix(this.properties.getSuffix());//后缀
resolver.setTemplateMode(this.properties.getMode());
if (this.properties.getEncoding() != null) {
resolver.setCharacterEncoding(this.properties.getEncoding().name());
}
resolver.setCacheable(this.properties.isCache());
Integer order = this.properties.getTemplateResolverOrder();
if (order != null) {
resolver.setOrder(order);
}
resolver.setCheckExistence(this.properties.isCheckTemplate());
return resolver;
}
注意点:Controller层主类上要注解申明在存储的参数返回页面数据才会生效,自动引导过去
页面 加上名称空间
<html xmlns:th="http://www.thymeleaf.org">
3、基本语法
3、1.表达式
表达式名字 | 语法 | 用途 |
---|---|---|
变量取值 | ${…} | 获取请求域、session域、对象等值 |
选择变量 | *{…} | 获取上下文对象值 |
消息 | #{…} | 获取国际化等值 |
链接 | @{…} | 生成链接 |
片段表达式 | ~{…} | jsp:include 作用,引入公共页面片段 |
3、2.字面量
文本值: ‘one text’ , ‘Another one!’ **,…**数字: 0 , 34 , 3.0 , 12.3 **,…**布尔值: true , false
空值: null
变量: one,two,… 变量不能有空格
3、3.文本操作
字符串拼接: +
变量替换: |The name is ${name}|
3、4.数学运算
运算符: + , - , * , / , %
3、5.布尔运算
运算符: and , or
一元运算: ! , not
3、6.比较运算
比较: > , < , >= , <= ( gt , lt , ge , le **)**等式: == , != ( eq , ne )
3、7.条件运算
If-then: (if) ? (then)
If-then-else: (if) ? (then) : (else)
Default: (value) ?: (defaultvalue)
3、8.特殊操作
无操作: _
4、设置属性值-th:attr
设置单个值
<form action="subscribe.html" th:attr="action=@{/subscribe}">
<fieldset>
<input type="text" name="email" />
<input type="submit" value="Subscribe!" th:attr="value=#{subscribe.submit}"/>
</fieldset>
</form>
数据访问
1、导入JDBC场景
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
这里说一下版本,先去看一下自己MySQl的版本号再去Maven Repository: Search/Browse/Explore (mvnrepository.com)搜索相对应版本
创建application.ymal文件
spring:
datasource:
url: jdbc:mysql://localhost:3306/db_account
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
测试
@Slf4j
@SpringBootTest
class Boot05WebAdminApplicationTests {
@Autowired
JdbcTemplate jdbcTemplate;
@Test
void contextLoads() {
// jdbcTemplate.queryForObject("select * from account_tbl")
// jdbcTemplate.queryForList("select * from account_tbl",)
Long aLong = jdbcTemplate.queryForObject("select count(*) from account_tbl", Long.class);
log.info("记录总数:{}",aLong);
}
}
2、使用Druid数据源
1、druid官方github地址
https://github.com/alibaba/druid
整合第三方技术的两种方式
-
自定义
-
找starter
2、自定义方式
1、创建数据源
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.17</version>
</dependency>
ymal 配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/mybatis
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
druid:
aop-patterns: com.atguigu.admin.*
filters: stat,wall
stat-view-servlet:
enabled: true
login-username: admin
login-password: admin
resetEnable: false
web-stat-filter:
enabled: true
urlPattern: /*
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
filter:
stat:
slow-sql-millis: 1000
logSlowSql: true
enabled: true
wall:
enabled: true
config:
drop-table-allow: false
jdbc:
template:
query-timeout: 3
整合Mybatis
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
待完善。。。。。
环境异常
java: java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor (in unnamed module @0x48203678) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.processing to unnamed module @0x48203678
JDK 版本不一致 或者没有配 默认路径
打开IDEA的 File → Structure,快捷键Ctrl + Shift + Alt + S