Springboot(编程不良人)

本文深入探讨Springboot的使用,包括SpringbootApplication注解详解、配置文件管理、对象创建、属性注入、mybatis整合策略、@Mapper与@MapperScan区别、本地测试方法、日志处理、文件上传下载、拦截器机制、部署方式、Restful API设计、异常处理和CORS跨域资源共享。通过实例分析,全方位解析Springboot在实际开发中的应用。
摘要由CSDN通过智能技术生成

Springboot(编程不良人)

文章目录

1、SpringbootApplication注解相关说明

该注解是一个只能作用在类上组合注解(由@SpringBootConfiguration和@EnableAutoConfiguration和@ComponentScan)

image-20211026211139995

其中@Target(指定注解作用范围)、@Retention(指定注解什么时候有效)、@Doucumented、@Inherited四个注解为java自带的元注解:只能修饰注解的注解。

  • @SpringBootConfiguration:这个注解就是用来自动配置spring、springmvc(初始化servlet。。。)相关环境

  • @EnableAutoConfiguration:开启自动配置,自动配置spring相关环境,引入第三方技术自动配置环境(mybatis-springboot、redis-springboot等第三方技术)

  • ComponentScan:组件扫描 根据注解发挥注解作用,默认扫描当前包以及其子包

2、配置文件拆分以及加载外部配置文件

平时我们的生产环境配置和开发环境配置一般不同,如何在springboot的配置文件中更换不同环境的配置文件

方法一

1、通过application-XXX.yml命名作为其他环境配置

2、在application.yml中更换配置环境

测试

1.通过application.yml进行公共配置

image-20211026223335975

2.创建开发环境application-dev.yml

image-20211026223614427

3.创建开发环境application-prod.yml

image-20211026223628599

3.在application.yml设置开启的环境配置

image-20211026224002097

4、访问hello请求

image-20211026224040135

方法二 调用外部的配置文件

修改启动程序的参数

image-20211026224555260

–spring.config.location=外部配置文件的绝对地址

3、管理对象的创建

3.1、创建单个对象

在springboot中管理单个对象课直接使用spring框架中注解形式创建

  • @Component 通过注解创建对象
    • Controller 用来创建控制器对象
    • Service 用来创建业务层对象
    • Repository 用来创建Dao层对象
      • 以上注解都有value属性,value属性用来指定工厂终对象的名称

例子:

1、service包中的DemoService接口

public interface DemoService {
   
    public void Demo();
}

2.service包中的DemoServiceImpl类

@Service
public class DemoServiceImpl implements DemoService{
   
    @Override
    public void Demo() {
   
        System.out.println("Demo()方法");
    }
}

3、controller包中的DemoController

@RestController
public class DemoController {
   
    @Autowired
    private DemoService demoService;
    @RequestMapping("/demo")
    public String demo(){
   
        demoService.Demo();
        return "demo ok";
    }
}

3.2、创建多个对象

如何在springboot中像spring框架一样通过xml创建对个对象,在springboot中也提供了相同的注解,如:

@Configuration、@Bean

  • @Configuration:代表这是一个spring的配置类,相当于spring.xml配置文件
  • @Bean:用来在工厂中创建这个@Bean注解表示对象
    • 默认使用@Bean创建对象在工厂中唯一标识为方法名称
    • 修改在工厂中对象标识可以使用@Bean(“工程中的名字”)指定一个名字

例子:

1.在config包下创建BeanConfig类

@Configuration//注解表名这是一个配置类,相当于spring中的spring.xml
public class BeanConfig {
   
    @Bean//注入Calendar类型的对象,名字与方法名相同
    public Calendar calendar(){
   
        return Calendar.getInstance();
    }
}

2、controller层测试

@RestController
public class DemoController {
   
    @Autowired
    private DemoService demoServiceImpl;
    @Autowired
    private Calendar calendar;
    @RequestMapping("/demo")
    public String demo(){
   
        demoServiceImpl.Demo();
        System.out.println("日期:"+calendar.getTime());
        return "demo ok";
    }
}

4、属性注入

1、@Value注解进行属性注入

引用类型:@Autowried

8中基本类型,String,数组、list、map

例子:

1、appliacation.yml

name: 小莫
age: 21
birthday: 2000/12/12 12:12:12 #java中默认的日期格式是:yyyy/mm/dd HH:MM:ss
sex: false
qqs: 1,2,3,4 #注入数组时,多个元素用','隔开
lists: morant,more,lirmood #注入list时,多个元素用,隔开,和数组一样
maps: "{'name':'morant','age':'21'}" #json字符串的形式

2、injectController

@RestController
public class injectController {
   
    @Value("${name}")
    private String name;
    @Value("${age}")
    private int age;
    @Value("${birthday}")
    private Date birthday;
    @Value("${sex}")
    private boolean sex;
    @Value("${qqs}")
    private int[] qqs;
    @Value("${lists}")
    private List<String> lists;
    @Value("#{${maps}}")//在注入map集合时,配置文件要是用json格式赋值 在注入式必须使用@{#{${}}}进行注入
    private Map<String,String> maps;
    @RequestMapping("/inject")
    public String inject(){
   
        System.out.println("name = " + name);
        System.out.println("age = " + age);
        System.out.println("birthday = " + birthday);
        System.out.println("sex = " + sex);
        System.out.println("=================");
        System.out.println("数组遍历");
        for (int qq : qqs) {
   
            System.out.println("qq = " + qq);
        }
        System.out.println("=================");
        System.out.println("list遍历");
        lists.forEach(li-> System.out.println("li = " + li));
        System.out.println("=================");
        System.out.println("map遍历");
        maps.forEach((key,value)-> System.out.println("key = " + key+" value = "+ value));
        return "inject ok";
    }
}

2、以对象的形式注入

@ConfigurationProperties:

/**
*作用范围:作用在类上
* 作用:用来指定配置文件中前缀的属性 注入到当前对象中属性一致的属性中
* 注意:必须要有get和set方法
*/

例子:

1、application.yml文件

order:
  id: 19100116
  age: 21

2、inject2Controller(一定要有get和set方法,一定要是用@ConfigurationProperties注解)

@RestController
/**
 * 作用范围:作用在类上
 * 作用:用来指定配置文件中前缀的属性 注入到当前对象中属性一致的属性中
 * 注意:必须要有get和set方法
 */

@ConfigurationProperties(prefix = "order")
public class inject2Controller {
   
    private String id;
    private String age;
    @RequestMapping("/inject2")
    public String inject2(){
   
        System.out.println(id);
        System.out.println(age);
        return "inject2 OK";
    }

    public String getId() {
   
        return id;
    }

    public void setId(String id) {
   
        this.id = id;
    }

    public String getAge() {
   
        return age;
    }

    public void setAge(String age) {
   
        this.age = age;
    }
}

5、整合mybatis思路分析

5.1、回顾spring框架如何整合mybatis

1.引入依赖

  • spring相关
  • mysql相关 驱动 数据源
  • mybatis相关 mybatis核心jar mybatis和spring框架整合

2。spring.xml

  • 开启注解扫描
  • 创建数据源对象
    • 注入 指定使用哪种数据源类型 注入diverClassName 注入url、username、password
  • 创建sqlSessionFactory
    • 注入 数据源 注入mapper配置文件位置 注入实体别名包
  • 创建Dao对象
    • 注入SqlSessionFactory 以及Dao接口所在包
  • 创建事务管理器 DataSourceTranacationManager
    • 注入数据源对象
  • 在业务层组件上加入事务注解 @Transacational

3.测试

5.2、springboot框架如何整合mybatis

image-20211101213652055

1.引入依赖

  • spring-web
  • mysql相关 mysql驱动 druid数据源
  • mybatis相关(mybatis-spring-boot-stater)依赖

2.书写配置

  • 开启注解扫描 @SpringBootApplication @ComponentScan可以省略
  • 创建数据源
    • 注定数据源类型
    • 指定数据库驱动
    • 指定url
    • 指定username
    • 指定password
  • 创建SqlSessionFactory
    • 指定mapper配置文件的位置
    • 指定实体所在的包的位置 起别名
  • 创建Dao
    • 指定Dao接口所在的包

3.测试

例子

1、导入依赖

		<!--导入数据源 druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.4</version>
        </dependency>
        <!--导入数据库驱动 mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>
        <!--导入mybatis-springboot-starter 包含mybatis和mybatis-spring-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>

2、修改配置文件 application-yml

server:
  port: 8989
  servlet:
    context-path: /springboot-mybatis
#整合mybatis相关配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    password: 123456
    username: root
    url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
#mybatis相关配置设置之后 才会创建SqlSessionFcatory
mybatis:
  type-aliases-package: com.morant.entity #指定实体类的包名,默认别名:类名或者类名的首字母小写
  mapper-locations: classpath:com/morant/mapper/*.xml #指定mapper配置文件的位置

#在主类中指定dao接口所在的包

3、在主类中指定dao接口所在的包

@SpringBootApplication
@MapperScan("com.morant.dao")//修饰范围:用在类上 作用:用来扫描dao接口所在的包 同时将所有dao接口在工厂中创建代理对象
public class SpringBootMybatisApplication {
   

    public static void main(String[] args) {
   
        SpringApplication.run(SpringBootMybatisApplication.class, args);
    }

}

4、测试

4.1、创建数据库

image-20211101221410546

4.2、创建实体类User

public class User {
   
    private int id;
    private String name;
    private String password;

    public User(int id, String name, String password) {
   
        this.id = id;
        this.name = name;
        this.password = password;
    }

    public User() {
   
    }

    public int getId() {
   
        return id;
    }

    public void setId(int id) {
   
        this.id = id;
    }

    public String getName() {
   
        return name;
    }

    public void setName(String name) {
   
        this.name = name;
    }

    public String getPassword() {
   
        return password;
    }

    public void setPassword(String password) {
   
        this.password = password;
    }
}

4.3、创建Userdao接口

public interface UserDao {
   
    public List<User> findall();
}

4.4、在创建UserDaoMapper配置文件

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.morant.dao.UserDao">

    <select id="findall" resultType="user">
        select id,name,password 
        from `user`
    </select>

</mapper>

4.5、创建UserService接口

public interface UserService {
   
    public List<User> findall();
}

4.6、创建UserServiceImpl实现类

@Service
@Transactional
public class UserServiceImpl implements UserService{
   
    private UserDao userDao;
	 @Autowired
    public UserServiceImpl(UserDao userDao) {
   
        //这里报错没关系,因为Dao还没被主类扫描进来,或者在Dao上加@Mapper
        this.userDao = userDao;
    }
    public List<User> findall(){
   
        return userDao.findall();
    };
}

4.7创建UserController

6、@Mapper注解和@MapperScan接口的区别

@Mapper:添加在Dao接口上,在工厂中创建代理对象,但是一次只能作用一个Dao接口,相对麻烦

7、本地测试

7.1、spring中的本地测试

1、启动工厂

ApplicationCpntext context = new ClassPathXmlApplicationContext("spring.xml")

2、从工厂中获得指定对象

UserDao userDao = context.getBean("UserDao")

3、调用方法

useDao.xxx(参数)

7.2、Springboot框架中完成本地测试

1.引入结合junit和springboot的依赖

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
  1. 启动springboot应用才能启动工厂 注入测试对象

@SpringBootTest

​ 作用范围:在类上

​ 作用:在这个类实例化过程中启动springboot应用

8、日志处理

springboot框架集成日志logback日志

8.1、日志的级别

img

  • ALL:最低等级的,用于打开所有日志记录。

  • TRACE:很低的日志级别,一般不会使用。

  • DEBUG: 指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。

  • INFO: 消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的日志。

  • WARN: 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。

  • ERROR: 指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。

  • FATAL: 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。

  • OFF: 最高等级的,用于关闭所有日志记录。

8.2、日志的配置

#配置日志
logging:
  level:
    root: info #全局日志
    com.morant.service: debug #指定包的日志
  file:
    name: run.log #输出日志文件的名字
    path: ./ #将日志文件生成在本项目下

调试时输出日志

@Service
@Transactional
public class UserServiceImpl implements UserService{
   
    private static final Logger log = LoggerFactory.getLogger(UserServiceImpl.class);
    private UserDao userDao;

    @Autowired
    public UserServiceImpl(UserDao userDao) {
   
        this.userDao = userDao;
    }
    public List
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MMorant

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值