Spring Boot笔记

官网:Spring | Home

​ 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>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vBZSCNiI-1650417099853)(images\Snipaste_2022-03-27_15-27-31.png)]

装这个插件

在这里插入图片描述

在实体类上加上@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
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值