2021-10-24 springboot学习——黑马视频补充


前言

由于黑马视频的笔记比较少,故本文添加一些笔记方便复盘和供大家学习


一、SpringBoot读取配置文件的内容?

SpringBoot读取配置文件以及之前的内容参照链接https://blog.csdn.net/weixin_44600430/article/details/104599467
其中还包括怎么切换不同的配置环境(生产环境,测试环境等等)
再之前的内容请参照黑马视频

二、SpringBoot整合Junit

1.通过SpringInitializr快速创建SpringBoot项目

在这里插入图片描述

2.调整测试类

在这里插入图片描述

3.创建service类

首先改变启动类的包扫描范围:
在这里插入图片描述
然后创建FirstService类,记得要添加@Service注解,把此类交给Spring管理创建:

package com.example.service.FirstService;

import org.springframework.stereotype.Service;

/**
 * Author: Admin
 * Date: 2021/10/24 17:38
 * FileName: FirstService
 * Description:
 */
@Service
public class FirstService {
    public void add(){
        System.out.println("add...");
    }
}

最后编写测试代码;

package com.example.withredis;

import com.example.service.FirstService.FirstService;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;


@RunWith(SpringRunner.class)
@SpringBootTest(classes = WithRedisApplication.class)
class WithRedisApplicationTests {

	//自动装配
    @Autowired
    private FirstService fs;

    @Test
    void contextLoads() {
        fs.add();
    }

}

三、SpringBoot整合redis

与整合junit类似,使用Spring的初始化器来创建项目;

1.通过SpringInitializr快速创建SpringBoot项目

注意:勾选redis:
在这里插入图片描述
在pom文件中可以看到比正常的项目多了redis启动器的相关依赖:

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

2.测试:

直接自动注入RedisTemplate类即可,编写测试代码:

package com.example.withredis;

import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;


@RunWith(SpringRunner.class)
@SpringBootTest(classes = WithRedisApplication.class)
class WithRedisApplicationTests {

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @Test
    void test1() {
        redisTemplate.boundValueOps("name").set("张三");
    }
    @Test
    void test2(){
        String name = redisTemplate.boundValueOps("name").get();
        System.out.println(name);
    }


}

不用配置是因为不配置默认是6379端口,本地ip,因此如果想连接远程redis需要在配置文件里面修改redis的相关配置:
在这里插入图片描述

四、SpringBoot整合mybatis

1.创建项目

参考上面使用spring创建项目,勾选:
在这里插入图片描述

2.修改配置文件

1.redis不需要修改配置文件,因为没有账号密码,但是mysql就必须指定了
2.mybatis可以使用纯注解开发,但本人喜欢使用mapper.xml来编写动态sql,因此也需要指定mybatis的mapper文件位置,(当然也可以指定使用哪个mybatis的配置文件,此处未指定,使用的默认配置)
在application.yml中配置如下:
在这里插入图片描述

如果driver报红,那么在pom文件中找到;

<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

注释掉runtime所在行即可。

3.编写mapper.xml与mapper类

在这里插入图片描述
编写测试sql…

4.运行测试:

此时直接运行测试文件:
在这里插入图片描述
会报错;

No MyBatis mapper was found in ‘[com.example.demo]’ package. Please check your configuration.

参考:
https://www.cnblogs.com/nana-qiu/p/11555060.html
https://www.cnblogs.com/yangshaoxiang/p/12974555.html (这篇看不懂但是很牛)
方法;在引导启动类上添加注解扫描mapper:

@MapperScan(basePackages = “com.example.demo.dao”)

或者
在Mapper类上添加注解@Mapper:
在这里插入图片描述
均可。

五、SpringBoot自动配置-Condition

引出——如果引入redis的依赖jedis,那么SpringBoot就会创建出jedis的bean来供我们使用,如果没有引入相对应的依赖,那么SpringBoot就不会创建出对应的Bean来使用,这是如何实现的呢?

1.SpringBoot可以通过@Condition注解来定义是否要创建某个bean

比如:配置配置类如下(注意开启SBoot的引导启动类的包扫描注解):

@Configuration
public class UserConfig {
    @Bean(value = "user")
    @Conditional(Condition2.class)
    public User getUser(){
        User user = new User();
        return user;
    }
}

加了Conditional注解后,SBoot会根据@Conditional(Condition2.class)里面写的Condition2.class的返回值来判断是否生成此bean。
Condition2.class配置如下:

public class Condition2 implements Condition {

    /**
     * @author admin
     * @Date 2021/10/25 19:25
     * @Description

     * @param: context :context是上下文对象,用来获取env环境对象可以获取配置文件内容,或者获取bean
     * @param: metadata:可以获得注解中的属性值
    * @return boolean
     */
    @SneakyThrows
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Map<String, Object> annotationAttributes = metadata.getAnnotationAttributes(Condition1.class.getName());
        return false;
    }
}

Conditional注解里面的配置类必须要实现Condtion接口。

此时启动SpringBoot,在启动类中添加部分代码:

@SpringBootApplication(scanBasePackages = "com.example")
public class SpringBootConditionApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(SpringBootConditionApplication.class, args);
        Object user = applicationContext.getBean("user");
        System.out.println(user);

    }

}

会报错无法找到此bean。

2.模仿实现SpringBoot的功能

以导入jedis依赖为例,实现导入jedis就创建bean,不导入就不创建:
首先要明白,1.如果能导入redis.clients.jedis.Jedis就说明导入了jedis依赖 2.Class.forName("redis.clients.jedis.Jedis"); 如果不报错就说明导入了jedis依赖,报错就说明没有导入jedis依赖。
改变Condition2的代码如下:

public class Condition2 implements Condition {

    /**
     * @author admin
     * @Date 2021/10/25 19:25
     * @Description

     * @param: context :context是上下文对象,用来获取env环境对象可以获取配置文件内容,或者获取bean
     * @param: metadata:可以获得注解中的属性值
    * @return boolean
     */
    @SneakyThrows
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        boolean flag = true;
        try {
            Class<?> aClass = Class.forName("redis.clients.jedis.Jedis");
        }catch (Exception e){
            flag=false;
        }

        return flag;
    }
}

这样就可以实现导入jedis就创建bean,不导入就不创建。但是不推荐这种做法,只是利用报错机制来模仿自动创建Bean的过程。

3.模仿进阶

实现自定义注解,达到动态创建的目的,即上一部分实现的是:写死判断jedis依赖是否存在,现在实现判断任意依赖是否存在:
第一步:创建自己的注解,自己的注解需要实现@Conditional的全部功能,并且能传入需要判断的以来的字符串。
创建@Condition1注解如下:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(Condition2.class)
//@Conditional(Condition2.class)可以保证@Condition1实现@Conditional(Condition2.class)的功能。
//上述还有三个注解是点进去@Conditional上面的注解扒拉下来的,其具体含义不在这里解释了。
public @interface Condition1 {
// String[] value();就是用来接受传入要判断的字符串依赖,由于可能需要判断的不止一个,因此写成字符串的形式
    String[] value();
}

使用自己的注解,SpringBoot配置类如下(这里还是只判断了jedis为例):

@Configuration
public class UserConfig {
    @ConditionalOnProperty(name = "name1",havingValue = "value1")
    @Bean(value = "user")
    @Condition1("redis.clients.jedis.Jedis")
    public User getUser(){
        User user = new User();
        return user;
    }
}

在Condition2中获取字符串

public class Condition2 implements Condition {

    /**
     * @author admin
     * @Date 2021/10/25 19:25
     * @Description

     * @param: context :context是上下文对象,用来获取env环境对象可以获取配置文件内容,或者获取bean
     * @param: metadata:可以获得注解中的属性值
    * @return boolean
     */
    @SneakyThrows
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Map<String, Object> annotationAttributes = metadata.getAnnotationAttributes(Condition1.class.getName());
        String[] values = (String[])annotationAttributes.get("value");//这已经获取到了自定义注解里面的参数了
        System.out.println(Arrays.toString(values));
        //下方未修改,但是很容易就可以推断出写法
        boolean flag = true;
        try {
            Class<?> aClass = Class.forName("redis.clients.jedis.Jedis");
        }catch (Exception e){
            flag=false;
        }

        return flag;
    }
}

其实Spring内置了很多的判断的注解:
在这里插入图片描述

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

六、SpringBoot自动配置-切换内置服务器

在这里插入图片描述
在pom文件中做此改动即可,原理还是SBoot识别依赖的原理->排除tomcat的依赖,加上jetty的依赖

七、SpringBoot自动配置-Enable注解

点进@SpringBootApplication 可以看到:在这里插入图片描述
重点是@EnableAutoConfiguration
知识点较为琐碎,看视频:https://www.bilibili.com/video/BV1Lq4y1J77x?p=22

八、SpringBoot自动配置-Enable注解

在这里插入图片描述

九、SpringBoot 自动配置-自定义starter

十、SpringBoot 监听机制

在这里插入图片描述
在这里插入图片描述

十一、SpringBoot 启动流程分析

后续待补充,但是大概率没有补充了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值