• SpringBoot


    文章目录

    SpringBoot(约定大于配置)

    工具

    jdk

    maven

    springboot

    idea

    • 直接在官网下载
    • 用idea自动生成springinitialize

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gWat4CBD-1661318637409)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220719102903934.png)]

    这些都是没用的

    启动springboot

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dqe6xBTb-1661318637413)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220720141827691.png)]

    要在主方法里,不要在单元测试里

    配置修改

    1. 端口修改
    #更改端口号
    server.port=8080
    
    • 1
    • 2
    1. 修改控制台打印图

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GqoZ7iXR-1661318637414)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220719145517466.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zVAUBXTr-1661318637415)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220719145539406.png)]

    在resource下新建banner.txt 把图放进去就可以了

    pom.xml核心依赖

    插件安装失败----->install一下 在右侧maven下

    我们在写或者引入一些springboot依赖的时候,不需要指定版本,因为有这些版本库

    • 启动器

    说白了就是springboot的启动场景;

    比如spring-boot-starter-web自动导入web环境所有的依赖

    springboot会将所有的功能场景都变成一个个的启动器

    我们要使用什么功能就只需要找到对应的启动器就可以了

    <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starterartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 主程序

      Component放类上面,Autowird放类里的方法或属性上

    @SpringBootConfiguration   spring boot的配置
        @COnfiguration   spring配置类
        @Component    说明这是一个spring的组件、、
      
        
    @EnableAutoConfiguration    自动配置
        @AutoConfigurationPackage    自动配置包
        @Import({Registrar.class})    导入选择器
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    结论:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vCCV2U4U-1661318637416)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220719154550847.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w38rba84-1661318637417)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220719161714112.png)]

    springboot配置

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dPUTv6PY-1661318637418)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220719162514026.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QdzGWJOV-1661318637418)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220719162739049.png)]

    两者区别:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QE2HXn9B-1661318637419)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220719163218221.png)]

    yaml里还可以行内写法(对空格要求极为严格)

    student: {name:zy,age:3}
    
    #数组
    pets:
    	- cat
    	- dog
    	- pig
    pets: [cat,dog,pig]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    yaml可以给实体类赋值

    一些注释功能

    @Autowired自动装配到类那里,取到类的值)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X67Tw2mu-1661318637419)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220719165534716.png)]

    @Value

    @Value("修狗")
    private String name;
    @Value("3")
    private Integer age;
    
    • 1
    • 2
    • 3
    • 4

    yaml可以保存对象,用yaml关联类的对象

    使用@ConfigurationProperties(prefix=“person”)

    #yaml
    person:
      name: 张钰
      age: 4
      happy: true
      birth: 2000/05/02
      maps: {k:1,v:2}
      list:
        - code
        - music
        - girl
    
    zy:
      name: 张钰
      age: 3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    @Component
    @ConfigurationProperties(prefix="person") 
    public class Person {
        private String name;
        private Integer age;
        private Boolean happy;
        private Date birth;
        private Map<String,Object> maps;
        private List<Object> lists;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    Test@SpringBootTest
    class Demo2ApplicationTests {
    
    //    自动装配
        @Autowired
        private Person p;
    
        @Test
        void contextLoads() {
            System.out.println(p);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    打印结果:

    Person{name=‘张钰’, age=4, happy=true, birth=Tue May 02 00:00:00 CST 2000, maps={k1=, v2=}, lists=null, zy=null}

    注意:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6EVXyj2p-1661318637420)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220719173346458.png)]

    ①:k:冒号后面要空格

    ②:person下的名字要和Person类里定义的变量名相同

    ③:需要重写get/set方法,打印的话需要toString方法

    ④:要用注释@ConfigurationProperties(prefix=“person”)

    ⑤:person实例化时要写上注释 @Autowired自动装配

    @PropertySource(value = “xxx”)加载指定(名字不是application.properties)的配置文件

    表达式SPEL取出配置文件的值

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZSdhXtiz-1661318637420)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220720104032599.png)]

    @PropertySource(value = "classpath:xue.properties")
    public class Person {
    
        @Value("${name}")
        private String name;
        private Integer age;
        private Boolean happy;
        private Date birth;
        private Map<String,Object> maps;
        private List<Object> lists;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    但是这样会乱码

    @Data(需要导入Lombok依赖)

    可以自动生成get/set方法,equals方法,canEqual方法,hashCode方法,toString方法,无参构造方法

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ezFDcluz-1661318637421)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220721095109167.png)]

    @AllArgsConstructor

    全参构造方法

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pjYUhOPJ-1661318637422)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220721095137000.png)]

    @NoArgsConstructor

    无参构造方法

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1PiqWaQZ-1661318637423)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220721095212368.png)]

    @Repository(被托管)

    @Repository(value=“userDao”)注解是告诉Spring,让Spring创建一个名字叫“userDao”的UserDaoImpl实例。

    当Service需要使用Spring创建的名字叫“userDao”的UserDaoImpl实例时,就可以使用@Resource(name = “userDao”)注解告诉Spring,Spring把创建好的userDao注入给Service即可。

    @Repository(value="userServiceNew")
    public class UserServiceImpl implements UserService {
    
        @Autowired
        UserMapper userMapper;
    
        public User Sel(int id){
            return userMapper.Sel(id);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    @RestController
    @RequestMapping("/testBoot")
    public class UserController {
     
        @Resource(name = "userServiceNew")
        private UserService userService;
     
        @RequestMapping("getUser/{id}")
        public Object GetUser(@PathVariable int id){
            return userService.Sel(id);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    @Configure

    使用注解@Configuration,告诉Spring Boot这是一个配置类。

    @EnableWebMvc

    @EnableWebMvc注解加上后,发现原本的一些默认配置并没有生效,即该注解加上后将会使用本类的配置为mvc配置,完全覆盖默认配置。所以没有特殊要求尽量不要加上该注解

    @PathVariable

    占位符 可以把url链接中的某个值拿到在方法中使用

    img

    img

    @EnableWebSecurity

    EnableWebSecurity注解有两个作用,1: 加载了WebSecurityConfiguration配置类, 配置安全认证策略。2: 加载了AuthenticationConfiguration, 配置了认证信息。

    @Async

    告诉spring这是一个异步任务

    @EnableScheduling

    
    //开启定时功能的注解
    
    • 1
    • 2

    yaml还可以这样

    age: ${random.int}
    ##如果person.hello存在happy为true否则为false(占位符)
    happy: ${person.hello:true} false
    
    • 1
    • 2
    • 3

    松散绑定

    就是配置文件里有个属性名叫last-name的话,那么类里要用驼峰命名lastName,而且他的set和get方法名为setLast Name和getLastName

    last-name: "张钰"
    
    • 1
    public String getLastName() {
        return lastName;
    }
    
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    JSR303数据校验

    • 首先要导入依赖
    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 接下来进行数据绑定
    @Validated//数据校验
    public class Person {
        @Email()
        private String lastName;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t5XYdS9x-1661318637424)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220720132638226.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b1cKKBOM-1661318637425)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220720132805352.png)]

    文件配置位置优先级排序

    优先级高—>低

    1. file:./config/
    2. file:./
    3. classpath:/config/
    4. classpath:/(默认:在resource根目录下)

    properties配置选择运行环境

    application.properties

    # springboot的多环境配置:可以选择激活其中哪一个文件
    spring.profiles.active=test
    
    • 1
    • 2

    application-dev.properties

    server.port=8081
    
    • 1

    application-test.properties

    server.port=8082
    
    • 1

    实际运行环境是8082,和appliction.properties里的profiles.active有关

    使用debug:true

    判断哪些配置生效了哪些没生效

    spring boot web开发

    什麽是webjars

    静态资源访问

    1. public,static,/**,resources 的直接映射到localhost:8080/这些都存放着静态资源
    2. 优先级:resource>static(默认)>public

    {“classpath:/META-INF/resources/”, “classpath:/resources/”, “classpath:/static/”, “classpath:/public/”}

    @Controller和@RestController的区别

    1. @RestController相当于@Controller和@ResponseBody合在一起的作用;
    2. 如果使用@RestController注解Controller层的话,则返回的是return里面的内容,无法返回到指定的页面,配置的视图解析器InternalResourceViewResolver也就自然没有作用了;
    3. 如果要返回到指定的页面,则需要用@Controller配合视图解析器InternalResourceViewResolver;
    4. 如果需要返回JSON、XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。
    //这里用RestController是返回不了test页面的,会返回test字符串
    @Controller
    public class TestController {
    
        @RequestMapping("zzzz")
        public String test(Model model){
            model.addAttribute("msg","hello,my name is xue");
            return "test";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    重定向页面

    要现在配置里定义

    @Configuration
    //@EnableWebMvc
    public class MyMvcConfig implements WebMvcConfigurer {
        @Override
        public void addViewControllers(ViewControllerRegistry registry){
    //        通过路径"/"和"index.html"
            registry.addViewController("/").setViewName("index");
            registry.addViewController("/index.html").setViewName("index");
            registry.addViewController("/main.html").setViewName("dashboard");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    @Controller
    public class LoginController {
        @RequestMapping("/user/login")
        public String login(@RequestParam("username") String username, @RequestParam("password") String password, Model model){
           if(!StringUtils.isEmpty(username) && "123456".equals(password)){
               return "redirect:/main.html";
           }else{
    //           告诉用户登录失败
               model.addAttribute("msg","用户名或者密码错误");
               return "index";
           }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    配置Druid

    首先引入包依赖,找对应的版本

    <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.24</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    然后在配置文件里引用,application.yaml

    spring:
     datasource:
        type: com.alibaba.druid.pool.DruidDataSource
    
    • 1
    • 2
    • 3

    写配置文件进行注入

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dyj7VxTl-1661318637425)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220722123455214.png)]

    后台监控功能

    //配置的话就需要这个注解
    @Configuration
    public class DruidConfig {
        @ConfigurationProperties(prefix = "spring.datasource")
        @Bean
        public DataSource druidDataSource(){
            return new DruidDataSource();
        }
    
    //    后台监控功能
        @Bean
        public ServletRegistrationBean a(){
            ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
    //        后台需要有人登录账号密码
            HashMap<String, String> initParameters = new HashMap<>();
    //        增加配置
            initParameters.put("loginUsername","admin");
            initParameters.put("loginPassword","123456");
    
    //        允许谁可以访问
            initParameters.put("allow","");
    //        禁止谁访问
            initParameters.put("xue","192.168.11.123");
            bean.setInitParameters(initParameters);//初始化参数
            return bean;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KrW7rRKx-1661318637426)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220722173730479.png)]

    在根路径后打druid进入登录页面

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7KQNP4li-1661318637426)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220722173755050.png)]

    过滤

    //    filter
        @Bean
        public FilterRegistrationBean webStatFilter(){
            FilterRegistrationBean bean = new FilterRegistrationBean();
            bean.setFilter(new WebStatFilter());
    //        可以过滤哪些请求呢?
            HashMap<String, String> initParameters = new HashMap<>();
    //        这些东西不进行统计
            initParameters.put("exclusions","*.js,*.css,/druid/*");
            bean.setInitParameters(initParameters);
    
            return bean;
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    整合Mybatis

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。

    使用过程

    pojo(User实体类)–>mapper(userMapper接口类)–>mybatis(mapper(UserMapper.xml)写sql语句的地方)–>controller(UserController控制层)

    整合包

    datasource:
      type: com.alibaba.druid.pool.DruidDataSource
      username: root
      password: 123
      url: jdbc:mysql://localhost:3306/mybatis?serverTime=UTC&useUnicode=true&characterEncoding=utf-8
      driver-class-name: com.mysql.cj.jdbc.Driver
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    链接数据库

    @SpringBootTest
    class Demo2ApplicationTests {
    
        @Autowired
        DataSource dataSource;
    
        @Test
        void contextLoads() throws SQLException {
            System.out.println(dataSource.getClass());
            System.out.println(dataSource.getConnection());
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    接口自动扫描

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rniQSHdn-1661318637427)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220723230143593.png)]

    package com.example.demo.mapper;
    
    import org.apache.ibatis.annotations.Mapper;
    //自动扫描接口第一种方法
    //这个注解表示了这是一个mybatis的mapper类
    @Mapper
    //@Component
    @Repository
    public interface userMapper {
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    //@SpringBootApplication:标注这是一个springboot应用
    @SpringBootApplication
    //@MapperScan("com.example.demo.mapper") 自动扫描接口第二种方法
    public class Demo2Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Demo2Application.class, args);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    配置

    #整合mybatis  pojo是实体类
    mybatis:
      type-aliases-package: com.example.demo.pojo
      #  这里的classpath就代表resources
      mapper-locations: classpath:mybatis/mapper/*.xml
    
    • 1
    • 2
    • 3
    • 4
    • 5

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-imO9psQM-1661318637428)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220723232128796.png)]

    UserMapper.xml

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WQaHJfV9-1661318637429)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220723232148925.png)]

    注意:记得改namespace

    <select id="queryUserById" resultType="User">
    
        select * from user where  id = #{id}
    select>
    
    • 1
    • 2
    • 3
    • 4
    userMapper类 接口类
    //自动扫描接口第一种方法
    //这个注解表示了这是一个mybatis的mapper类
    @Mapper
    //@Component
    @Repository
    public interface userMapper {
    //    第一个是返回值类型  第二个是方法名
        List<User> queryUserList();
        User queryUserById(int id);
        int addUser(User user);
        int updateUser(User user);
        int deleteUser(int id);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    UserController类
    //非渲染页面
    @RestController
    @RequestMapping
    public class UserController {
        @Autowired
        private UserMapper userMapper;
    
        @GetMapping("/queryUserList")
        public List<User> queryUserList(){
            List<User> userList = userMapper.queryUserList();
    
            for(User user : userList){
                System.out.println(user);
            }
            return userList;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    springSecurity(安全)

    在web开发中,安全第一位,过滤器,拦截器

    功能性需求:否(不做安全也能跑页面)

    做网站:安全应该在什么时候考虑?在设计之初

    漏洞。隐私泄露等等

    架构一旦确定,

    网络安全知名框架:shiro 、SpringSecurity:很像 除了类不一样名字不一样

    认证,授权(vip1,vip2,vip3)

    • 功能权限
    • 访问权限
    • 菜单权限
    • 拦截器、过滤器:大量的原生代码 冗余

    引入包依赖

    <dependency>
        <groupId>org.mybatis.spring.bootgroupId>
        <artifactId>mybatis-spring-boot-starterartifactId>
        <version>2.1.3version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    springSecurity的两个主要目标就是“认证Authentication”和“授权Authorization”(访问控制)

    认证和授权配置

    package com.example.demo.config;
    
    import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    
    
    //AOP:拦截器
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
    //        请求授权的规则
            http.authorizeHttpRequests()
                    .antMatchers("/").permitAll()
                    .antMatchers("/level1/**").hasRole("vip1");
    
    //        没有权限会默认到登录页 新版的默认开启
            http.formLogin();
        }
    
    //    请求认证的规则 springboot2.1.x 可以直接使用  5.0+写了很多加密方式
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    //        给密码进行硬编码
    //        auth.inMemoryAuthentication().withUser("笨蛋张钰").password("123").roles("vip1")
    //        .and()
    //                .withUser("xxx").password("123").roles("vip2");
    //        此时密码多了一些加密的规则
            auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                    .withUser("笨蛋张钰").password(new BCryptPasswordEncoder().encode("123")).roles("vip1")
            .and()
                    .withUser("xxx").password(new BCryptPasswordEncoder().encode("123")).roles("vip2");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hVA8fldX-1661318637430)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220724151213059.png)]

    注销

    https://docs.spring.io/spring-security/reference/reactive/authentication/logout.html

    使用“/toLogout”路由进行注销

    代码部分配置

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    //        请求授权的规则
        http.authorizeHttpRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("vip1");
    
    //        没有权限会默认到登录页 新版的默认开启
        http.formLogin();
    //        注销功能
         http.logout().logoutSuccessUrl("/");//注销成功跳到首页
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    新版

    @Bean
    SecurityWebFilterChain http(ServerHttpSecurity http) throws Exception {
    DelegatingServerLogoutHandler logoutHandler = new DelegatingServerLogoutHandler(
            new WebSessionServerLogoutHandler(), new SecurityContextServerLogoutHandler()
    );
    http
    .authorizeExchange((exchange) -> exchange.anyExchange().authenticated())
    .logout((logout) -> logout.logoutHandler(logoutHandler));
    
    return http.build();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    thymeleaf

    https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#standard-expression-syntax

    相关配置可以看thymeleafProperties.class

    格式在templates下的.html文件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yNAcebv8-1661318637430)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220720211143472.png)]

    使用变量

    text

    ///test.html

    <body>
    <!--所有的html元素都可以被thymeleaf替换接管:th:元素名-->
    <div th:text="${msg}"></div>
    </body>
    
    • 1
    • 2
    • 3
    • 4

    ///testController使用变量model

    @RequestMapping("zzzz")
    public String test(Model model){
        model.addAttribute("msg","hello,my name is xue");
        return "test";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    utext

    <!--转义就是把文本转换为html语言-->
    <div th:utext="${msg}"></div>
        
    @RequestMapping("zzzz")
    public String test(Model model){
        model.addAttribute("msg","

    hello,my name is xue

    "
    ); return "test"; }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    th:each

    <h3 th:each="x:${m}" th:text="${x}"></h3><h3 th:each="x:${m}">[[${x}]]</h3>
    
    @RequestMapping("zzzz")
    public String test(Model model){
        model.addAttribute("m", Arrays.asList("xue","yu"));
        return "test";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Attribute Precedence

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7UL2PQ5U-1661318637431)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220720211406077.png)]

    Expression

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZpxMyFBh-1661318637432)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220720213303617.png)]

    Swagger

    导包依赖

    
    <dependency>
        <groupId>io.springfoxgroupId>
        <artifactId>springfox-swagger-uiartifactId>
        <version>3.0.0version>
    dependency>
    
    <dependency>
        <groupId>io.springfoxgroupId>
        <artifactId>springfox-swagger2artifactId>
        <version>3.0.0version>
    dependency>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    编写一个hello工程

    写一个config

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2FoEqTH1-1661318637432)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220724172151384.png)]

    @Configuration
    @EnableSwagger2   //开启swagger
    public class SwaggerConfig {
    }
    
    • 1
    • 2
    • 3
    • 4

    访问 测试运行

    http://localhost:8080/swagger-ui.html

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o6fYHagF-1661318637433)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220724174740924.png)]

    集成的版本

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K2rQ5uL6-1661318637433)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220724174811650.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9bea8UtS-1661318637434)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220724174819085.png)]

    配置swagger

    Swagger的bean实例Docket

    @Configuration
    @EnableSwagger2//开启swagger
    public class SwaggerConfig {
    
    //    配置了Swagger的bean实例
        @Bean
        public Docket docket(){
            return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo());
        }
    
    
    //    配置Swagger信息=apiInfo
        private ApiInfo apiInfo(){
            Contact contact = new Contact("薛佳音", "", "2890807962@qq.com");
            return new ApiInfo("薛佳音的swagger日记",
                    "第一个接口文档",
                    "1.0", "http://baidu.com",
                    contact, "Apache 2.0",
                    "http://www.apache.org/licenses/LICENSE-2.0",
                    new ArrayList());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qDrXHQXZ-1661318637434)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220724181004554.png)]

    swagger配置扫描接口

    //    配置了Swagger的bean实例
    @Bean
    public Docket docket(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
    //        RequestHandlerSelectors配置要扫描接口的方式
    //                .apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))//指定扫描某个包的接口
                //paths(PathSelectors.ant("/com/**"))过滤什么路径
                .apis(RequestHandlerSelectors.any())//扫描任意一个包
                .build();//
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    image-20220724181928614

    配置是否启动

    .enable(false)
    
    • 1

    我只希望我的swagger在生产环境中使用,在发布的时候不使用

    • 判断是不是生产环境
    • 注入enable(flag)
    @Configuration
    @EnableSwagger2//开启swagger
    public class SwaggerConfig {
    
    //    配置了Swagger的bean实例
        @Bean
        public Docket docket(Environment environment){
    //        设置要显示的swagger环境
            Profiles profiles = Profiles.of("dev","test");
    //        获取项目的环境:通过environment.acceptsProfiles判断是否处在自己设定的环境
            boolean b = environment.acceptsProfiles(profiles);
            return new Docket(DocumentationType.SWAGGER_2)
                    .apiInfo(apiInfo())
                    .enable(false)
                    .select()
    //        RequestHandlerSelectors配置要扫描接口的方式
    //                .apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))//指定扫描某个包的接口
                    //paths(PathSelectors.ant("/com/**"))过滤什么路径
    
                    .apis(RequestHandlerSelectors.any())//扫描任意一个包
                    .build();//
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EIPrwpB2-1661318637435)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220724190145201.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uipd6QWi-1661318637435)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220724190156993.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vxug3Vli-1661318637436)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220724190215513.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Q8ooRvg-1661318637436)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220724190229175.png)]

    配置Api文档的分组

    .GroupName(“xue”)

    如何配置多个分组?

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KB9HBjyq-1661318637437)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220724192606337.png)]

    @Bean
    public Docket docket2(){
        return new Docket(DocumentationType.SWAGGER_2).groupName("A");
    }
    
    @Bean
    public Docket docket3(){
        return new Docket(DocumentationType.SWAGGER_2).groupName("B");
    }
    @Bean
    public Docket docket4(){
        return new Docket(DocumentationType.SWAGGER_2).groupName("C");
    }
    @Bean
    public Docket docket5(){
        return new Docket(DocumentationType.SWAGGER_2).groupName("D");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    扫描model

    image-20220724193142346

    User类(属性必须是public)

    public class User {
        public String username;
        public String password;
    }
    
    • 1
    • 2
    • 3
    • 4

    接口Controller

    //    只要我们的接口中,返回值中存在实体类,他就会被扫描到Swagger
    @GetMapping("/user")
    public User user(){
        return new User();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    给model加注释

    //给model实体类加注释
    @ApiModel("用户")
    public class User {
        @ApiModelProperty("用户名")
        public String username;
        @ApiModelProperty("密码")
        public String password;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    image-20220724193434851

    给接口和属性加注释

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8TRBRMak-1661318637437)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220725093206664.png)]

    //    api接口不是放在类上的 是方法  给方法加个注释
    @ApiOperation("hello控制类")
    @GetMapping(value = "/hello2")
    public String hello(@ApiParam("用户名") String username){
        return "hello"+username;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    任务

    异步任务

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xodMNpT0-1661318637438)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220725095425857.png)]

    @EnableAsync
    //enable....开启某个功能 enableAsync开启异步注解功能
    @SpringBootApplication 
    public class Demo3Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Demo3Application.class, args);
        }
    
    }
    //写在启动类上
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    邮件任务

    导依赖

    <dependency>
        <groupId>com.github.luuesgroupId>
        <artifactId>spring-boot-starter-emailartifactId>
        <version>1.3.0.5.RELEASEversion>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    配置

    spring.mail.username=2890807962@qq.com
    spring.mail.password=a15028922060
    spring.mail.host=smtp.qq.com
    #开启加密验证
    spring.mail.properties.main.smtp.ssl.enable=true
    
    • 1
    • 2
    • 3
    • 4
    • 5

    测试类

    @SpringBootTest
    class Demo3ApplicationTests {
    
        @Autowired
        JavaMailSenderImpl mailSender;
        @Test
        void contextLoads() {
            SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
            simpleMailMessage.setSubject("张钰哈哈哈");
            simpleMailMessage.setText("你是个笨蛋啊");
    //        simpleMailMessage.setTo("2782906917@qq.com");
            simpleMailMessage.setTo("2890807962@qq.com");
            simpleMailMessage.setFrom("2890807962@qq.com");
            ;
            mailSender.send(simpleMailMessage);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wXpgCVHd-1661318637439)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220725104804793.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l0UEKyWs-1661318637440)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220725105732492.png)]

    计划任务

    //    cron表达式  计划任务  在约定的时间执行
        //秒 分 时  日 月  周几
         @Scheduled(cron = "0 * * * * 0-7")
        public void hello2(){
            System.out.println("你被执行了");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    过程遇到的方法

    getClass()

    getClass() 返回此 Object 的运行时类。

    public class Test {
        public static void main(String[] args) {
            Person p = new Person(1,"刘德华");
            System.out.println(p.getClass());  
            System.out.println(p.getClass().getName()); 
        }
    }
    
    class Person{
        int id;
        String name;
        public Person(int id, String name) {
            super();
            this.id = id;
            this.name = name;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    运行结果

    img

    getConnection()

    如果数据库链接成功,那么会返回一个数据库链接的对象

    过程遇到的问题

    为什么接口里面的值必须是常量final且静态static

    // 接口里面的值必须是常量final且静态static
       public static final int age = 18;
    
    • 1
    • 2

    知识点1:一个类,首先他会在内存里面有一个类对象,然后由类对象生成类的对象 知识点2:为什么接口Interface里面的值必须是常量呢? 因为类可以被实例化,实例化的类的对象里面的变量就会被赋初始值。比如String 是 null int是0,double是0.0。但是接口呢?接口不能被实例化,所以接口里面如果是变量的话不会被赋初始值这样就会出问题。所以接口里面的值必须是常量final而且一定是static不管写不写都是(这句话引用自李老师的讲课内容)知识点3:那为什么它要是静态的呢?因为static是什么?是所有对象可以访问,而且可以直接通过类名访问。接口有对象么?显然没有,必须通过类名来访问所以是要静态的。

    /* 和/**的区别

    /* 是拦截所有的文件夹,不包含子文件夹
    /** 是拦截所有的文件夹及里面的子文件夹

    ::

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t4L7LYzh-1661318637441)(C:\Users\28908\AppData\Roaming\Typora\typora-user-images\image-20220823155526801.png)]

    的运行时类。

    public class Test {
        public static void main(String[] args) {
            Person p = new Person(1,"刘德华");
            System.out.println(p.getClass());  
            System.out.println(p.getClass().getName()); 
        }
    }
    
    class Person{
        int id;
        String name;
        public Person(int id, String name) {
            super();
            this.id = id;
            this.name = name;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    运行结果

    img

    getConnection()

    如果数据库链接成功,那么会返回一个数据库链接的对象

    过程遇到的问题

    为什么接口里面的值必须是常量final且静态static

    // 接口里面的值必须是常量final且静态static
       public static final int age = 18;
    
    • 1
    • 2

    知识点1:一个类,首先他会在内存里面有一个类对象,然后由类对象生成类的对象 知识点2:为什么接口Interface里面的值必须是常量呢? 因为类可以被实例化,实例化的类的对象里面的变量就会被赋初始值。比如String 是 null int是0,double是0.0。但是接口呢?接口不能被实例化,所以接口里面如果是变量的话不会被赋初始值这样就会出问题。所以接口里面的值必须是常量final而且一定是static不管写不写都是(这句话引用自李老师的讲课内容)知识点3:那为什么它要是静态的呢?因为static是什么?是所有对象可以访问,而且可以直接通过类名访问。接口有对象么?显然没有,必须通过类名来访问所以是要静态的。

    /* 和/**的区别

    /* 是拦截所有的文件夹,不包含子文件夹
    /** 是拦截所有的文件夹及里面的子文件夹

    ::

    [外链图片转存中…(img-t4L7LYzh-1661318637441)]

  • 相关阅读:
    APM/PX4/betaflight/inav开源飞控之IMU方向
    浅谈产业园区规划的意义、分类及功能!
    学点Selenium玩点新鲜~,让分布式测试有更多玩法
    基于51单片机的自动售货机Proteus仿真
    NX二次开发-UFUN CSYS坐标系转换UF_CSYS_map_point
    yoloV5环境搭建与运行(windows+pytorch+kaggle)
    pandas 基础和示例
    C语言第三十六弹---文件操作(中)
    汽车OTA
    使用DBeaver自动生成ER图
  • 原文地址:https://blog.csdn.net/qq_46503396/article/details/126502665