简单的说,spring boot就是整合了很多优秀的框架,不用我们自己手动的去写一堆xml配置然后进行配置。
从本质上来说,Spring Boot就是Spring,它做了那些没有它你也会去做的Spring Bean配置。它使用“习惯优于配置”(项目中存在大量的配置,此外还内置了一个习惯性的配置,让你无需手动进行配置)的理念让你的项目快速运行起来。使 用Spring Boot很容易创建一个独立运行(运行jar,内嵌Servlet容器)、准生产级别的基于Spring框架的项目,使用Spring Boot你可以不用或者只需要很少的Spring配置。
步骤分析:
建项目–
创建一个maven工程
注意:springboot整合的时候在建立maven工程的时候一定要创建一个父
工程 而且,父工程选择2.x的版本,因为我们用的是spring5.x的版本。
导依赖–
spring-boot-web.jar
写配置… 配置SpringBoot的核心配置文件application.properties
此处省略一堆字。因为我们今天要用springboot
创建类–
在src目录下的com.itiheimaba包下新建一个SpringBootApplicationRunner的类。并且在类上加上 @SpringBootApplication 的注解来表示此类就是一个SpringBoot的启动器。另外还需要我们在此类中写一个main方法,方法中利用
SpringApplication.run(SpringBootApplicationRunner.class,args);
来完成最终的启动。
访问localhost:8080
分析spring-boot-web这个依赖:由于这个依赖的导入,根据maven
的依赖机制他给我们导入了一大堆支持我们开发的依赖。
@SpringBootApplication
public class SpringBootApplicationRunner {
public static void main(String[] args) {
SpringApplication.run(SpringBootApplicationRunner.class, args);
}
}
解释此类的作用:
这个类就是我们SpringBoot 整合其他框架的一个启动类,一会所有准备都完事后,只要一运行此类,那么整合就完事了。
@SpringBootApplication = @Configuration + @EnableAutoConfiguration + @ComponentScan
@Configuration – 提到@Configuration就要提到他的搭档@Bean。使
用这两个注解就可以创建一个简单的spring配置
类,可以用来替代相应的xml配置文件。
@EnableAutoConfiguration – 能够自动配置spring的上下文,试图猜
测和配置你想要的bean类,通常会自动
根据你的类路径和你的bean定义自动配
置。
@ComponentScan – 会自动扫描指定包下的全部标有@Component的类,并注册成bean
@Target(ElementType.TYPE) // 当前注解的使用范围
@Retention(RetentionPolicy.RUNTIME) //生命周期
@Documented // 声明在生成doc文档时是否带着注解
@Inherited // 声明是否子类会显示父类的注解
总结:一个@SpringBootApplication注解就搞定了所有事,因为它觉得以上三个注解都是我们固定的配置,所以就给我们省略了。又封装出一个注解来代替,这就是SpringBoot 的核心设计思想。
思考–我们为什么要把SpringBoot工程的启动类创建在base包下?
SpringBoot工程运行时,扫描包来创建容器会扫描启动类所在的包以及它下面的子包。
SpringApplication.run(SpringBootApplicationRunner.class,args);
备注:
– run方法:
此方法是用于把启动类的字节码传入给SpringBoot的核心容器,
通过注解配置解析来创建IOC容器。
– 参数一:就是启动类的字节码。
– 参数二:通常情况下就是main方法的args
**拓展:args有内容吗?
验证:进行打印,会出现一个对象的地址
问题:我们关注控制台,有一个SpringBoot的图标。那这个图标我们可以不让其打印吗?
解释:可以。按照以下操作
SpringBootApplication sba = new SpringBootApplication(class);
sba.setBannerMode(Mode.off);
sba.run(args);
入门案例:springboot 整合Spring 和 springMVC
步骤分析:
** 在com.itheima 包下新建一个web.controller包
** 在web.controller下新建 HelloController
** 加入 @RestController 注解就ok 啦!
** 然后通过访问 localhost:8080/…
@RestController
public class TestController {
@RequestMapping("/hello")
public String hello(){
return "success";
}
}
重启传统的springmvc项目,访问一把!OK
修改:此时随便在controller类中改改 再访问!不OK
原因:我们改变源码了,但是没有重新部署!!!
解决:重新部署一遍,又OK了!!!
分析:
问题:
总是重新部署势必会花费大量的时间!这时候大胆畅想一下能不能修改源码后不重新部署也能生效呢?
注意:修改源码必须重新编译,重启是重新编译的手段。这个思想是没有问题的,但是我们此时要想的是能不能不重新部署也能完成重新编译!!!
解决:利用SpringBoot的热部署就可以实现。
如何实现SpringBoot的热部署
– 导入依赖
spring-boot-devtools.jar 2.0.0
导完坐标保存后我们的项目在开发工具中会有一个变化
springloaded-1.2.9.jar
注意:这个jar包我们直接导入不了,需要手动改变一下版本号。导入包以后还需要我们 在eclipse中配置
-javaagent:D:/RepMaven/RepMaven/org/springframework/springloaded/1.2.9/springloaded-1.2.9.jar -noverify
参数配置:是springloaded-1.2.9.jar 这个包在maven本地仓库的位置。
此时热部署就可以正常使用了…
– 创建一个新的项目
在刚才整合完springmvc的基础上进行整合
– 导依赖
mysql 驱动包
spring-boot-starter-data-jpa.jar
– 写配置
在项目的resources目录下新建application.properties文件
此文件中配置一些 经常修改 的信息,此处我们配置的是
数据库连接信息。
– 创建类
** 创建实体类 并利用注解建立与数据库的对应关系。
** 创建Dao接口并且 extends JpaRepository和JpaSpecificationExecutor
** 创建service层
** 创建Controller层,写相应的查询方法
引入jQueryeasyUI 插件,将数据显示到表格中
步骤分析:
– 在resources目录下新建一个static文件夹,必须
命名为static 这是springboot的规定,然后将easyUI的相关文件放入,最后直接访问 user.html 通过ajax
请求请求后台数据。
application.properties
#DB Configuration:
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springdata
spring.datasource.username=root
spring.datasource.password=199505140110
#JPA Configuration:
spring.jpa.database=mysql
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
步骤分析:
< dependency >
< groupId>org.mybatis.spring.boot groupId>
< artifactId>mybatis-spring-boot-starter artifactId>
< version>1.1.1 version>
dependency>
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import cn.itcast.info.pojo.User;
@Mapper
public interface UserMapper {
@Select("select * from user where name like
'%${value}%'")
public List<User> queryUserByName(String name);
}
– Service层新增一个接口和实现方法
– 进入controller 新增一个方法(此时需要传入参数,我
们用一下REST 风格)
@RequestMapping(“findUserByName/{name}”)
public List<User> findUserByName(@PtahVarable(“name”)String name){
List<User> list = userService.findUserByName(name);
Return list;
}
总结:
通过以上操作我们发现一个问题,就是热部署也不是万能的,当我们修改了Dao层中注解里面的SQL语句并不能自动部署。这个问题要注意,它属于一个细节,但是往往细节也能决定你的身价!!
注意:
mybatis的特性,只有实体类字段与数据库字段相同时对象才可以封装成功,如果不相同,记得sql语句起别名
@Override
//@Cacheable(value="userList")
@CacheEvict(value="userList",allEntries=true)
public List<User> findAll() {
System.err.println("到数据库查询*****************************************");
return userDao.findAll();
}
//替换运行器
@RunWith(SpringJUnit4ClassRunner.class)
//指定引导类的字节码
@SpringBootTest(classes=SpringBootApplicationRunner.class)
public class SpringBootJunitTest {
@Autowired
private IUserService userService;
@Test
public void testFindAll() {
List<User> users = userService.findAll();
for(User user : users) {
System.out.println(user);
}
}
}
总结:SpringBoot的Junit整合其实和spring对Junit的整合差不多,只是换了一个注解配置。
// 专门用来读取SpringBoot的核心配置文件
@Autowired
private Environment environment;
/**
* 读取SpringBoot的核心配置文件(application.properties)
*/
@Test
public void test(){
String url = environment.getProperty("spring.datasource.url");
System.err.println(url);
}
需求分析:
– 自定义一个mail.properties 文件
– 再创建一个MailProperty.java 对象
– mail.properties文件中的值和MailProperty.java
对象的属性对应。
– 然后最终直接操作MailProperty.java对象就相当于
操作mail.properties文件,从而达到不直接读取
mail.properties文件就能对其进行操作的目的。
操作步骤:
– 自定义一个mail.properties 文件
– 再创建一个MailProperty.java 对象
– mail.properties文件中的值和MailProperty.java
对象的属性对应。
– 在MailProperty.java 对象上配置两个注解
@ConfigurationProperties(prefix=”mail”)
@PropertySource(value=”classpath:mail.properties”)
注意:@ConfigurationProperties prefix属性的含义就是指定properties文件中的属性的前缀。
@PropertySource 注解是指定对应的properties文件的位置。
– 配置完了还不能用,此时我们需要一个springboot的一个依赖 spring-boot-configuration-processor
– 完成以上步骤后,发现还不行,此时我们还需要一个注解的配合才能完成。
== @Component 或者 @Configuration==
把以上注解配置到我们的MailProperty.java上就相当于把这个类当做一个可配置的类,才能够最终将 MailProperty.java 注入到IOC 容器中。
总结:这样做的好处就是当项目中有大量的properties文件的时候我们可以不用频繁的解析配置文件,而是转化成操作对象的方式,变得更简单。
@Component
@Configuration
@PropertySource("classpath:mail.properties")// 找目标文件
@ConfigurationProperties("mail")
public class MailProperty {
private String host;
private String port;
private String username;
private String password;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getPort() {
return port;
}
public void setPort(String port) {
this.port = port;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "MailProperty [host=" + host + ", port=" + port + ", username=" + username + ", password=" + password
+ "]";
}
@Autowired
private MailProperty mailProperty;
/**
* 自定义的配置文件(xx.proerties)
* 需求: 发送一份邮件,需要有发送邮件的相关必备信息
*/
@Test
public void test1(){
System.err.println(mailProperty.getHost());
}
mail.host=smtp.sina.com
mail.port=25
mail.username=itcast
mail.password=heima
概述:yml文件也是springboot为我们提供的一种核心配置文件的格式,它除了能像application.properties文件那样写配置,另外他也提供了一种新的数据结构就是
更加 一目了然 的树形结构。
用法:
1.读取普通数据
– 使用@Value 注解配合 Spring 的 EL 表达式
@Value("${mail.host}")
private String mailHost;
2.读取对象数据
– 和读取自定义的properties一样。
@Component
@PropertySource("classpath:mail.yml")// 找目标文件
@ConfigurationProperties("mail")
public class MailYml {
private String host;
private String port;
private String username;
private String password;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getPort() {
return port;
}
public void setPort(String port) {
this.port = port;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "MailYml [host=" + host + ", port=" + port + ", username=" + username + ", password=" + password
+ ", getHost()=" + getHost() + ", getPort()=" + getPort() + ", getUsername()=" + getUsername()
+ ", getPassword()=" + getPassword() + ", getClass()=" + getClass() + ", hashCode()=" + hashCode()
+ ", toString()=" + super.toString() + "]";
}
}
@Autowired
private MailYml mailYml;
/**
* 读取yml配置文件(SpringBoot中的一种特制 xx.yml)
*/
@Value("${spring.jpa.database}")
private String aaa;
@Test
public void test2(){
System.err.println(aaa);
System.err.println(mailYml);
}
#普通数据
spring.jpa.database: mysql
#对象数据
mail:
host: smtp.sina.com
port: 25
username: itcast
password: heima