java程序里面的spring_boot_第1页
java程序里面的spring_boot_第2页
java程序里面的spring_boot_第3页
java程序里面的spring_boot_第4页
java程序里面的spring_boot_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

概念spring boot对spring mvc、tomcat等都做了集成,只需要依赖spring boot的jar,通过注解指定主类,然后执行里面的main方法,它就能启动tomcat提供服务。不需要spring mvc的繁琐配置。使用spring boot时不需要引入spring mvc,tomcat等的依赖,只需要引入spring boot的依赖即可,它会自动寻找spring mvc,tomcat等的合适的版本引入,解决了框架中各种组件版本不一致的问题。安装配置:无ide手工方式:1、新建文件夹SpringBootSample2、该文件夹下新建文件pom.xml内容: 4.0.0 com.example myproject 0.0.1-SNAPSHOT org.springframework.boot spring-boot-starter-parent 1.4.0.RELEASE 其中parent里定义了很多依赖的版本,继承它之后,以后的依赖都不用写版本号,全从parent继承,这样可以避免版本冲突,将个依赖的版本都交给了spring boot管理。不过这里的示例没有任何依赖。3、cd到该目录下执行mvn package说明已经构建成功了4、构建web项目spring boot将各功能分成了不同模块,只需要添加需要的模块即可,版本号由spring boot统一管理,添加web模块后,它会自动引入spring mvc、tomcat、spring core等依赖。4.1 pom.xml加入依赖和插件 4.0.0 com.example myproject 0.0.1-SNAPSHOT org.springframework.boot spring-boot-starter-parent 1.4.0.RELEASE org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-maven-plugin引入spring-boot-maven-plugin插件可以使mvn package打出的jar包能直接用java jar命令运行,未使用插件:会提示:使用了插件:多了BOOT-INF,主类的class和所有依赖包都在里面。4.2 编写主类java由于添加web依赖后它会自动去找主类的main方法,找不到会报错,因此需要创建主类:创建SpringBootSamplesrcmainjava目录结构在该目录下创建Example.java内容:import org.springframework.boot.*;import org.springframework.boot.autoconfigure.*;import org.springframework.stereotype.*;import org.springframework.web.bind.annotation.*;RestControllerEnableAutoConfigurationpublic class Example RequestMapping(/) String home() return kkk!; public static void main(String args) throws Exception SpringApplication.run(Example.class, args); 其中EnableAutoConfiguration表示该类是主类,从该类main方法启动。RestController是Controller和ResponseBody的组合写法,表示方法返回的内容直接给客户端,而不是去找模板。4.3构建运行有3种方式,一种是利用spring boot插件,执行:mvn spring-boot:run它会自动启动tomcat,默认端口是8080或者mvn package打出jar文件,然后执行:java -jar target/myproject-0.0.1-SNAPSHOT.jar第三种方式是在ide里面直接执行主类的main方法。5、访问应用http:/localhost:8080使用ide创建:idea和eclipse中创建maven项目,跟手工方式一样配置即可。idea向导创建idea中还提供了直接创建spring boot项目的方式,可以通过向导勾选web等spring boot的模块:File-New Project-Spring Initializr配置说明向导创建出来的工程配置跟手工创建的一致:自动创建的主类:注意这里创建了一个配置文件,默认是空的。可以将很多配置放在里面,如启动端口,数据库连接等自定义配置信息。EnableAutoConfiguration 和 SpringBootApplication说明 SpringBootApplication等同于Configuration,EnableAutoConfiguration,ComponentScan三个属性的组合。当访问非主类的Controller时,就需要主类配置ComponentScan属性才能扫描到,否则扫描不到。因此主类上通常用 SpringBootApplication,这样就可以扫描到其他类的bean。修改端口和上下文路径perties中增加配置:server.port=90server.context-path=/kkk访问:使用yml配置yml文件配置可以减少properties的配置量,如:注意:1、冒号后面必须带一个空格,否则无法识别2、要注意缩进,因为它通过代码行缩进确定属性归属级别的。使用value读取配置yml配置:读取:测试:配置中引用配置:用$引用即可,如: 注入分组配置:如果配置的属性较多,则使用value需要对每个属性都写一个变量来接收,很不方便,可以将属性放到一个分组里,然后定义一个实体类来接收参数,使用时只用引用该实体类即可:这里的prefix跟配置中的对应。这里使用ConfigurationProperties注入了company里面的属性。也可以直接注入到Controller,需要在controller中定义配置的属性不过最好不要这样用。如:。分dev、online环境配置:如:java -jar指定环境不过这种方式切环境需要改代码,可以在java jar运行参数中指定环境,它会覆盖掉配置中指定的环境。如:java -jar kkk-0.0.1-SNAPSHOT.jar -files.active=online使用thymeleaf模板thymeleaf是spring提供的模板,类似于freemarker、velocity等。pom.xml加入依赖: org.springframework.boot spring-boot-starter-thymeleaftemplates目录下新建index.html然后使用Controller即可返回模板。使用常用的springmvc注解匹配多个路径如:RequestMapping(value = list, users)public String list() return index;GetMapping、PostMapping等的简化写法GetMapping(list)相当于RequestMapping(value = list, method = RequestMethod.GET).PostMapping、PutMapping等同理。使用spring data jpajpa是一套java提出的规范,用于持久化操作,jpa有很多实现,如hibernate、toplink等。spring data jpa是封装在hibernate、toplink等上面一层的实现,用户通过它来操作hibernate等,可以不关心底层实现。配置pom.xml加入依赖: org.springframework.boot spring-boot-starter-data-jpa mysql mysql-connector-javaapplication.yml配置:spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql:/:3306/users username: root password: 123456 jpa: hibernate: ddl-auto: update show-sql: true其中ddl-auto:update表示如果没有表会自动创建表,有表则不动。create表示则每次都会把原表drop掉重新创建。create-drop表示每次都重新创建表,应用停下来就把表删除none表示不执行任何ddl。validate表示不执行ddl,但会检查实体类和表结构是否一致,不一致就报错。show-sql:true表示打印sql语句。创建实体类Company.java:import org.hibernate.annotations.Generated;import org.springframework.boot.autoconfigure.domain.EntityScan;import perties.ConfigurationProperties;import org.springframework.stereotype.Component;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;/* * Created by Administrator on 2017/12/7. */Entitypublic class Company Id GeneratedValue private Long id; private String name; private String address; public Long getId() return id; public void setId(Long id) this.id = id; public String getAddress() return address; public void setAddress(String address) this.address = address; public String getName() return name; public void setName(String name) = name; 其中Id表示主键, GeneratedValue表示自动生成执行程序即可自动创建表Long映射成了bigint(20)String映射成了varchar(255)增删改查操作:查询全部数据新增数据查询单条数据更新更新也是调用save,发现有id就自动执行update语句删除根据条件查询接口里增加的这个方面名字是约定,它会自动根据name去查询。开启事务需要开启事务的方法上增加Transactional注解即可。表单验证1、实体类上用注解加条件:2、方法参数上用Valid指定验证的实体,后面紧接一个BindingResult参数获取验证结果。RequestMapping(addCompany)public Company addCompany(Valid Company company, BindingResult bindingResult) if (bindingResult.hasErrors() System.out.println(bindingResult.getFieldError().getDefaultMessage(); return null; return companyRepository.save(company);这里如果不返回null,则执行到companyRepository.save(company);时会抛出异常,jpa会验证实体类的属性。异常处理可以异常进行统一处理定义异常处理类:MyExceptionHandler.java:package com.example.demo;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.ResponseBody;/* * Created by Administrator on 2017/12/15. */ControllerAdvicepublic class MyExceptionHandler ExceptionHandler(value=Exception.class) ResponseBody public String kkk() return error happend; 它会自动捕捉异常调用方法。 一般会自定义异常类型,调用不同方法,这里使用Exception异常类只是为了做示范。自定义异常类通常会增加code属性,抛异常时传入code,外面可以取得code。通常使用方法:ResultEnum.javapublic enum ResultEnum ERROR(-1, 未知错误), SUCCESS(0, 成功); private Integer code; private String msg; ResultEnum(int code, String msg) this.code = code; this.msg = msg; public Integer getCode() return code; public String getMsg() return msg; MyException.javapublic class MyException extends RuntimeException private Integer code; public MyException(ResultEnum resultEnum) super(resultEnum.getMsg(); this.code = resultEnum.getCode(); public Integer getCode() return code; public void setCode(Integer code) this.code = code; 抛异常throw new MyException(ResultEnum.ERROR);MyExceptionHandler.javaimport org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.ResponseBody;/* * Created by Administrator on 2017/12/15. */ControllerAdvicepublic class MyExceptionHandler ExceptionHandler(value=MyException.class) ResponseBody public String kkk(MyException e) return e.getMessage(); ExceptionHandler(value=RuntimeException.class) ResponseBody public String kkkkkk(RuntimeException e) return runtime exception; 注意这里的MyException继承了RuntimeException,它会自动判断抛出异常的类型,找到最精确的匹配,如抛出MyException,则会调用kkk方法。使用AOP1、加入aop依赖 org.springframework.boot spring-boot-starter-aop2、编写切面类:如:package com.example.demo;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.springframework.stereotype.Component;/* * Created by Administrator on 2017/12/14. */AspectComponentpublic class CompanyAspect Before(execution(public * com.example.demo.CompanyController.list(.) public void beforeList() System.out.println(aspect-before list); 3、测试:springaop各种注解的详细用法参见”springaop.docx”主类的位置和spring扫描包路径默认的spring扫描包路径是从主类开始一层层往下扫描,也可以在主类上用注解设置,如:ComponentScan(basePackages=com.example)如果类没有在扫描包路径下,则即使加了Component等注解也不会被ioc容器发现。使用单元测试的时候,由于单元测试类必须在主类的包路径以下才能找到依赖,因此主类最好放到最外层。关于包路径的说明通过这个菜单可以修改:测试包的根目录下面的所有测试类的测试方法,都会加入maven的test生命周期运行。使用单元测试在test/java这种测试包下创建测试的java文件即可,一般测试包层级跟main/java下的包层级一致,测试类也跟main/java里的类一一对应,便于管理。可以使用idea快速创建测试文件,在需要测试的方法上右键-go to-Test,然后选方法创建文件就行了。但创建出来的类上需要手动加上RunWith(SpringRunner.class)、SpringBootTest注解。测试service的方法测试service的方法很简单,只用注入service即可,如:import com.example.demo.Company;import org.junit.Assert;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;import org.springframework.transaction.annotation.Transactional;/* * Created by Administrator */RunWith(SpringRunner.class)SpringBootTestpublic class CompanyServiceTest Autowired CompanyService companyService; Transactional Test public void testGetOne() Company company = companyService.getOne(2L); System.out.println(company= + company); Assert.assertEquals(company.getAge(), new Integer(56); 跟一般的Junit测试类似,也是在方法上点右键运行即可。这里加Transactional是因为jpa的懒加载,加上它防止session提前关闭。使用Mock测试controller的方法import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;import org.springframework.test.web.servlet.result.MockMvcResultMatchers;import org.springframework.test.web.servlet.setup.MockMvcBuilders;import static org.junit.Assert.*;/* * Created by Administrator */RunWith(SpringRunner.class)SpringBootTestAutoConfigureMockMvcpublic class CompanyControllerTest Autowired private MockMvc mvc; Test public void list() throws Exception mvc.perform(MockMvcRequestBuilders.get(/company/list) .andExpect(MockMvcResultMatchers.status().isOk() .andExpect(MockMvcResultMatchers.content().string(kkk); 注意这里增加了AutoConfigureMockMvc注解。mock会自动发送http请求,这里是使用get方法请求/company/list这个路径,断言返回状态为200(isOk(),返回值是”kkk”,否则报错。跳过单元测试整合Mybatis整合mybatis其实就是降数据库连接配置到配置文件,再通过mybatis.mapper-locations=classpath:mybatis/*.xml属性指定映射文件的扫描路径,它就会到映射文件中找到namespace对应的Mapper接口,如:,然后自动创建接口实现类放到spring容器,bean的id就是接口名的首字母小写,如:创建实体类User.javapackage com.example2.domain;public class User private Long id; private String name; private Integer age; public Long getId() return id; public void setId(Long id) this.id = id; public String getName() return name; public void setName(String name) = name; public Integer getAge() return age; public void setAge(Integer age) this.age = age; 创建UserMapper.javaimport com.example2.domain.User;import org.apache.ibatis.annotations.Mapper;import java.util.List;/* * Created by Administrator on 2017/12/8. */public interface UserMapper List getAll(); User getOne(Long id); void insert(User user); void update(User user); void delete(Long id);如果主类上的MapperScan没有扫描到,这里可以加上Mapper让其扫描到。创建映射文件User.xml SELECT id, name, age FROM users SELECT id, name, age FROM users WHERE id = #id INSERT INTO users (name,age) VALUES (#name, #age) UPDATE users name = #name, age = #age, WHERE id = #id DELETE FROM users WHERE id =#id 配置文件pertiesmybatis.type-aliases-package=com.example2.domainspring.datasource.driverClassName = com.mysql.jdbc.Driverspring.datasource.url = jdbc:mysql:/localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8spring.datasource.username = rootspring.datasource.password = 123456mybatis.mapper-locations=classpath:mybatis/*.xml创建UserController.javapackage com.example2;import com.alibaba.fastjson.JSON;import com.example2.domain.User;import com.example2.mapper.UserMapper;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*;/* * Created by Administrator on 2017/12/5. */RestControllerRequestMapping(user)public class UserController Autowired protected UserMapper userMapper; RequestMapping(list) public String list() return JSON.toJSONString(userMapper.getAll(); RequestMapping(id) public String findOne(PathVariable Long

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论