https://img2024.cnblogs.com/blog/3305226/202503/3305226-20250331155133325-143341361.jpg

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;
    }
}

image-20250609175540808

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;
    }

image-20250609190337906

不同名称的映射

@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

image-20250609201427915

使用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简单整合

完成用户的增删改查

image-20250610193328092

依赖

<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);
    }
}

image-20250610200339949

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 拦截器

image-20250610211349150

拦截器概念

  • 拦截器(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满足先进先出的原则

image-20250611144319440

Springboot

创建springboot工程

image-20250611163953843

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

image-20250611164026592

原因:

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

image-20250611172348601

springboot提供的web起步依赖便包含了构建web项目所需要的依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
</dependency>

image-20250611172657789

如果想用其他的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);
}
posted @ 2025-06-12 19:19  kudo4869  阅读(7)  评论(0)    收藏  举报