Spring框架学习(三)
Spring学习(三)
学习视频: 【黑马程序员SSM框架教程_Spring+SpringMVC+Maven高级+SpringBoot+MyBatisPlus企业实用开发技术】https://www.bilibili.com/video/BV1Fi4y1S7ix?p=109&vd_source=2884b80d333f3bfc8048b360e6195550
Spingmvc
依赖:
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
<packaging>war</packaging>
<build>
<plugins>
<!--Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/wp</path>
<port>80</port>
<uriEncoding>UTF-8</uriEncoding>
<server>tomcat6</server>
</configuration>
</plugin>
</plugins>
</build>
controller层编写
@Controller
public class UserController {
//设置当前操作的返回值类型
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("user save");
return "{'module':'save'}";
}
}
config层编写
为了加载controller对应bean
//创建springmvc的配置文件,加载controller对应的bean
@Configuration
@ComponentScan("com.kudo.controller")
public class SpringMvcConfig {
}
这个则是在servlet容器启动时,让servlet以springmvc处理,springmve案例成功
//定义一个servlet容器启动的配置类,在里面加载spring的配置
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
//加载springmvc容器配置
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}
//设置哪些请求归属springmvc处理
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
//加载spring容器配置
@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}

bean加载控制
如果项目中还有spring项目,则需要完成各自对应的bean加载
即SpringConfig使用excludeFilters排除Springmvc中bean的加载
@Configuration
@ComponentScan(value = "com.kudo",
excludeFilters = @ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = Controller.class
))
public class SpringConfig {
}
容器的注册配置
//定义一个servlet容器启动的配置类,在里面加载spring的配置
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
//加载springmvc容器配置
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}
//设置哪些请求归属springmvc处理
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
//加载spring容器配置
@Override
protected WebApplicationContext createRootApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringConfig.class);
return ctx;
}
}
简化开发
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
请求与响应
普通参数 传参即可
@RequestMapping("/save")
@ResponseBody
public String save(String name,String age){
return "name:"+name+",age:"+age;
}

不同名称的映射
@RequestParam("uname") String name
pojo参数传递
http://127.0.0.1/wp/book/save?name=hello&age=12 可以对应自动封装
public String save(User)
pojo包括引用属性
public class User {
private String name;
private int age;
private Address address;
}
@RequestMapping("/pojoContainPojoParam")
@ResponseBody
public string pojocontainPojoParam(User user){
System.out.println("pojo嵌套pojo参数传递 user ==>"+user)
return "{'module':'pojo contain pojo param'}";
}
请求:
http://localhost/pojoContainPojoParam?name=test&age=15&address.city=beijing&address.province=hb
数组参数
@RequestMapping("/arrayParam" )
@ResponseBody
public string arrayParam(string[] likes){
System.out.println("数组参数传递 likes ==>"+ Arrays.tostring(likes));
return "{'module':'array param'}";
}
得保证名称一致
http://localhost/arrayParam?likes=game&likes=music&likes=trave
集合参数 得加入@RequestParam,LIst<>无构造方法
@RequestMapping("/listParam")
@ResponseBody
public string listParam(@RequestParam List<string> likes){
System.out.println("集合参数传递 likes ==>"+ likes);
return "{'module':'list param'}";
}
http://localhost/arrayParam?likes=game&likes=music&likes=trave
传递json数据
依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.2</version>
</dependency>
@EnableWebMvc//使json转为对象
public class SpringMvcConfig{
}
@RequestMapping("/listParamForJson")
@ResponseBody
public string listParamForJson(@RequestBody List<string> likes){
System.out.println("list common(json)参数传递 list ==>"+likes);
return"f'module':'list common for json param'}";
}
参数:
["test","hello","asd"]
json POJO传递
@RequestMapping("/pojoParamForJson")
@ResponseBody
public string listParamForJson(@RequestBody User user){
System.out.println("pojo 参数传递 user ==>"+user);
return"f'module':'pojo common for json param'}";
}
参数:
{
"name":"itcast",
"age" :15,
'address":{
"province":"beijing",
"city" :"beijing'
}
}
日期类型参数传递
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date,
@DateTimeFormat(pattern = "yyyy-MM-dd") Date date1,
@DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss") Date date2) {
System.out.println("参数传递 date ==> " + date);
System.out.println("参数传递 date1(yyyy-MM-dd) ==> " + date1);
System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> " + date2);
return "{'module':'data param'}";
}
响应页面:
去掉@ResponseBody
//响应页面/跳转页面
@RequestMapping("/toJumpPage")
public String toJumpPage(){
System.out.println("跳转页面");
return "page.jsp";
}
响应文本数据
//响应文本数据
@RequestMapping("/toText")
@ResponseBody
public String toText(){
System.out.println("返回纯文本数据");
return "response text";
}
返回json对象
//响应POJO对象
@RequestMapping("/toJsonPOJO")
@ResponseBody
public User toJsonPOJO(){
System.out.println("返回json对象数据");
User user = new User();
user.setName("itcast");
user.setAge(15);
return user;
}
REST风格
- 传统风格资源描述形式
http://localhost/user/getById?id=1
http://localhost/user/saveUser
- REST 风格描述形式
http://localhost/user/1
http://localhost/user

使用Restful风格编程
@Controller
@RequestMapping("/book")
public class BookController {
@RequestMapping("/save")
@ResponseBody
public String save(@RequestBody User user){
System.out.println("user save... " + user);
return "{'module':'user save'}";
}
@RequestMapping("/delete" )
@ResponseBody
public String delete(Integer id){
System.out.println("user delete... " + id);
return "{'module':'user delete'}";
}
@RequestMapping("/update")
@ResponseBody
public String update(@RequestBody User user){
System.out.println("user update..."+user);
return "{'module':'user update'}";
}
@RequestMapping("/getById" )
@ResponseBody
public String getById(Integer id){
System.out.println("user getById..."+id);
return "{'module':'user getById'}";
}
}
使用Restful
@Controller
@RequestMapping("/book")
public class BookController {
@RequestMapping(value = "/users",method = RequestMethod.POST)
@ResponseBody
public String save(@RequestBody User user){
System.out.println("user save... " + user);
return "{'module':'user save'}";
}
@RequestMapping(value = "/users/{id}" ,method = RequestMethod.DELETE)
@ResponseBody
public String delete(@PathVariable Integer id){
System.out.println("user delete... " + id);
return "{'module':'user delete'}";
}
@RequestMapping(value = "/users",method = RequestMethod.PUT)
@ResponseBody
public String update(@RequestBody User user){
System.out.println("user update..."+user);
return "{'module':'user update'}";
}
@RequestMapping(value = "/users/{id}",method = RequestMethod.GET)
@ResponseBody
public String getById(@PathVariable Integer id){
System.out.println("user getById..."+id);
return "{'module':'user getById'}";
}
}
简化开发:
@RestController // @controller @ReponseBody
@RequestMapping("/books")
public class BookController {
// @RequestMapping( method = RequestMethod.POST)
@PostMapping
public String save(@RequestBody Book book){
System.out.println("book save..." + book);
return "{'module':'book save'}";
}
//@RequestMapping(value = "/{id}",method = RequestMethod.DELETE)
@DeleteMapping("/{id}")
public String delete(@PathVariable Integer id){
System.out.println("book delete..." + id);
return "{'module':'book delete'}";
}
}
SSM整合
SSM简单整合
完成用户的增删改查

依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.18</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!--Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/wp</path>
<port>80</port>
<uriEncoding>UTF-8</uriEncoding>
<server>tomcat6</server>
</configuration>
</plugin>
</plugins>
</build>
config层
@Configuration
@ComponentScan({"com.kudo.service"})
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class,MybatisConfig.class})
public class SpringConfig {
}
@Configuration
@ComponentScan("com.kudo.controller")
@EnableWebMvc
public class SpringMvcConfig {
}
public class JdbcConfig {
@Value("${jdbc.driver}")
public String driver;
@Value("${jdbc.url}")
public String url;
@Value("${jdbc.username}")
public String username;
@Value("${jdbc.password}")
public String password;
@Bean
public DataSource dataSource(){
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
return ds;
}
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(dataSource);
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
}
public class MybatisConfig {
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setTypeAliasesPackage("com.kudo.domain");
return sqlSessionFactoryBean;
}
//扫描映射
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(){
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setBasePackage("com.kudo.dao");
return mapperScannerConfigurer;
}
}
public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
Dao
public interface UserDao {
@Insert("insert into tb_user (username,password,gender,addr) values(#{username},#{password},#{gender},#{addr})")
public void save(User user);
@Select("select * from tb_user where id = #{id}")
public User findById(int id);
@Update("update tb_user set username = #{username}, name = #{name}, password = #{password}, gender = #{gender}, addr = #{addr} where id = #{id}")
public void update(User user);
@Delete("delete from tb_user where id = #{id}")
public void delete(int id);
@Select("select * from tb_user")
public List<User> findAll();
}
domain
public class User {
private Integer id;
private String username;
private String password;
private String gender;
private String addr;
...
service
@Transactional
public interface UserService {
public boolean save(User user);
public User findById(int id);
public boolean update(User user);
public boolean delete(int id);
public List<User> findAll();
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public boolean save(User user) {
userDao.save(user);
return true;
}
@Override
public User findById(int id) {
return userDao.findById(id);
}
@Override
public boolean update(User user) {
userDao.update(user);
return true;
}
@Override
public boolean delete(int id) {
userDao.delete(id);
return true;
}
@Override
public List<User> findAll() {
return userDao.findAll();
}
}
SSM表现层数据封装
前端接受数据格式--创建结果模型类,封装数据到Result类中,同意处理
package com.kudo.controller;
public class Code {
public static final Integer SAVE_OK = 20011;
public static final Integer DELETE_OK = 20021;
public static final Integer UPDATE_OK = 20031;
public static final Integer GET_OK = 20041;
public static final Integer SAVE_ERR = 20010;
public static final Integer DELETE_ERR = 20020;
public static final Integer UPDATE_ERR = 20030;
public static final Integer GET_ERR = 20040;
}
public class Result {
private int code;
private String msg;
private Object data;
public Result() {
}
public Result( int code,Object data) {
this.data = data;
this.code = code;
}
public Result(int code, Object data,String msg) {
this.code = code;
this.msg = msg;
this.data = data;
}
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserServiceImpl userService;
@PostMapping
public Result save(@RequestBody User user) {
boolean flag = userService.save(user);
return new Result(flag ? Code.SAVE_OK : Code.SAVE_ERR,flag);
}
@GetMapping("/{id}")
public Result findById(@PathVariable int id) {
User user = userService.findById(id);
int code = user != null ? Code.GET_OK : Code.GET_ERR;
String msg = user != null ? "":"数据查询失败";
return new Result(code,user,msg);
}
@PutMapping
public Result update(@RequestBody User user) {
boolean flag = userService.update(user);
int code = flag ? Code.UPDATE_OK : Code.UPDATE_ERR;
return new Result(code,flag);
}
@DeleteMapping("/{id}")
public Result delete(@PathVariable int id) {
boolean flag = userService.delete(id);
int code = flag ? Code.DELETE_OK : Code.DELETE_ERR;
return new Result(code,flag);
}
@GetMapping
public Result findAll() {
List<User> users= userService.findAll();
int code = users != null ? Code.GET_OK : Code.GET_ERR;
String msg = users != null ? "" : "查询失败";
return new Result(code,users,msg);
}
}

SSM异常处理器
集中的,统一的处理项目中出现的异常
package com.kudo.controller;
@RestControllerAdvice //可以声明一个类,作为异常处理器类
public class ProjectExceptionAdvice {
@ExceptionHandler(Exception.class)//处理哪一种异常
public Result doException(Exception e) {
return new Result(666,null,"异常");
}
}
项目异常处理方案
业务异常(BusinessException)
- 发送对应消息传递给用户,提醒规范操作
系统异常(SystemException)
- 发送固定消息传递给用户,安抚用户
- 发送特定消息给运维人员,提醒维护
- 记录日志
其他异常(Exception)
- 发送固定消息传递给用户,安抚用户
- 发送特定消息给编程人员,提醒维护(纳入预期范围内)
- 记录日志
1.自定义项目系统级异常
public class SystemException extends RuntimeException{
private Integer code;
public SystemException(Integer code,String message) {
super(message);
this.code = code;
}
public SystemException( Integer code,String message, Throwable cause) {
super(message, cause);
this.code = code;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
}
2.自定义项目业务级异常
public class BusinessException extends RuntimeException{
private Integer code;
public BusinessException(Integer code, String message) {
super(message);
this.code = code;
}
public BusinessException(Integer code, String message, Throwable cause) {
super(message, cause);
this.code = code;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
}
3.自定义编码
public class Code {
public static final Integer SYSTEM_UNKNOW_ERROR = 50001;
public static final Integer SYSTEM_TIMEOUT_ERROR = 50002;
public static final Integer PROJECT_VALIDATE_ERROR = 60001;
public static final Integer PROJECT_BUSINESS_ERROR = 60002;
}
4.触发自定义异常
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookDao bookDao;
public Book getById(Integer id) {
if( id < 0 ){
throw new BusinessException(Code.PROJECT_BUSINESS_ERROR,"请勿进行非法操作!");
}
return bookDao.getById(id);
}
}
5.拦截并处理异常
@RestControllerAdvice
public class ProjectExceptionAdvice {
@ExceptionHandler(BusinessException.class)
public Result doBusinessException(BusinessException ex){
return new Result(ex.getCode(),null,ex.getMessage());
}
@ExceptionHandler(SystemException.class)
public Result doSystemException(SystemException ex){
// 记录日志(错误堆栈)
// 发送邮件给开发人员
// 发送短信给运维人员
return new Result(ex.getCode(),null,ex.getMessage());
}
@ExceptionHandler(Exception.class)
public Result doException(Exception ex){
// 记录日志(错误堆栈)
// 发送邮件给开发人员
// 发送短信给运维人员
return new Result(Code.SYSTEM_UNKNOW_ERROR,null,"系统繁忙,请联系管理员!");
}
}
Springmvc 拦截器

拦截器概念
- 拦截器(Interceptor)是一种动态拦截方法调用的机制,在 SpringMVC 中动态拦截控制器方法的执行
- 作用:
- 在指定的方法调用前后执行预先设定的代码
- 阻止原始方法的执行
入门案例:
同样还是之前的例子
1.编写拦截类
package com.kudo.controller.interceptor;
@Component
public class ProjectInterceptor implements HandlerInterceptor {
//在原始被拦截的操作之前
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandl");
return true;//false终止原始操作
}
//之后
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}
}
2.配置拦截类
//为了指定什么时候匹配拦截器
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
@Autowired
private ProjectInterceptor projectInterceptor;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(projectInterceptor).addPathPatterns("/users");
}
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
}
}
Mvc扫描此包
@Configuration
@ComponentScan({"com.kudo.controller","com.kudo.config"})
@EnableWebMvc
public class SpringMvcConfig {
}
简化开发
合并SpringMvcConfig与SpringMvcSupport
使SpringMvcConfig实现WebMvcConfigurer接口
@Configuration
@ComponentScan({"com.kudo.controller"})
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer {
@Autowired
private ProjectInterceptor projectInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(projectInterceptor).addPathPatterns("/users");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
}
}
多拦截器同样的方式直接添加即可,先配置先触发。
且pre,post满足先进先出的原则

Springboot
创建springboot工程


直接可以编写controller运行,springboot已解决了spring,springmvc的配置

原因:
在springboot的依赖中spring-boot-dependencies里配置了各种版本以及依赖的管理

springboot提供的web起步依赖便包含了构建web项目所需要的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

如果想用其他的servlet容器如jetty则可以使用如下设置置换,排除起步依赖,以及添加jetty的起步依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--web起步依赖环境中,排除Tomcat起步依赖-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--添加Jetty起步依赖,版本由SpringBoot的starter控制-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
</dependencies>
基础配置
配置文件
application.properties
server.port=8080
application.yml或application.yaml
server:
port: 8080
logging:
level:
root: warn
配置文件加载顺序
application.properties > application.yml > application.yaml
读取yaml配置信息
1.使用Environment类
便捷的读取配置文件
@RestController
@RequestMapping("/users")
public class UsersController {
@Autowired
private Environment environment;
@GetMapping("/{id}")
public void getUser(@PathVariable int id) {
System.out.println("id: " + id);
System.out.println(environment.getProperty("enterprise.subject[0]"));
System.out.println(environment.getProperty("server.port"));
System.out.println("helllo");
}
}
2.创建实体类读取
@Component
@ConfigurationProperties(prefix = "enterprise")
public class Enterprise {
private String name;
private int age;
private String[] subject;
@RestController
@RequestMapping("/users")
public class UsersController {
@Autowired
private Environment environment;
@Autowired
private Enterprise enterprise;
@GetMapping("/{id}")
public void getUser(@PathVariable int id) {
System.out.println("id: " + id);
System.out.println(environment.getProperty("enterprise.subject[0]"));
System.out.println(environment.getProperty("server.port"));
System.out.println("helllo");
System.out.println(enterprise.getName());
System.out.println(Arrays.stream(enterprise.getSubject()).toArray());
}
}
多环境配置
#设置启用的环境
spring:
profiles:
active: dev
---
spring:
config:
activate:
on-profile: dev
server:
port: 8080
---
spring:
config:
activate:
on-profile: test
server:
port: 8081
---
spring:
config:
activate:
on-profile: pro
server:
port: 8082
---
enterprise:
name: test
age: 18
subject:
- Java
- python
- C
多环境启动命令格式:
java -jar springboot.jar --spring.profiles.active=test(dev,pro) --server.port=88
- SpringBoot 中 4 级配置文件
1 级: file : config/application.yml 【最高】
2 级: file : application.yml
3 级: classpath: config/application.yml
4 级: classpath: application.yml 【最低】
Springboot整合
Springboot整合JUnit
@SpringBootTest//加载springboot的启动类,也就是加载spring的启动环境
class SpringbootApplicationTests {
@Autowired
private UserService userService;
@Test
void contextLoads() {
userService.save();
}
}
Springboot整合ssm
springboot已经整合了spring和springmvc,接下来整合mybatis即可
jdbc的配置在yml中,如需要配置数据库连接池(如druid)则添加依赖然后通过type指定即可
server:
port: 8080
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/pikachu
username: kudo
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
而Dao接口不变,扫描包的方式通过@Mapper代替了之前ssm中的包扫描
@Mapper
public interface UserDao {
@Select("select * from tb_user where id = #{id}")
User getById(int id);
}

浙公网安备 33010602011771号