SpringBoot02-application配置文件+基本框架的整合
Spring Boot 的配置文件主要用于配置项目的运行参数和环境变量常用的有application.properties和application.yml或application.yaml两种格式。配置内容可以取springboot官网查询。一、配置文件的作用配置文件可以用于配置类型举例应用基本信息应用名、端口号、环境等数据库数据库连接信息日志日志级别、路径缓存Redis、EhCache消息队列Kafka、RabbitMQ安全配置登录认证、权限自定义参数可以被Value或ConfigurationProperties读取二、文件格式Spring Boot 支持两种配置格式配置项的内容一致只是格式不一样推荐使用yml的格式2-1.application.properties示例# 服务器端口 server.port8081 # 应用名 spring.application.namemyapp # 数据库连接 spring.datasource.urljdbc:mysql://localhost:3306/testdb spring.datasource.usernameroot spring.datasource.password123456 # 日志级别 logging.level.com.example.demoDEBUG2-2.application.yml/application.yaml示例推荐使用可读性更强server: port: 8081 spring: application: name: myapp datasource: url: jdbc:mysql://localhost:3306/testdb username: root password: 123456 logging: level: com.example.demo: DEBUG2-3、配置文件的内容配置文件的具体内容是可以在springboot的官网搜索到的https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html【注意】不是所有的properties都能写的properties是和你当前项目用到的技术有关的关键联系server.port这个属性之所以能生效IDE 显示绿色 ✓是因为项目中引入了spring-boot-starter-web依赖。application.properties里能写什么配置取决于你项目依赖了哪些 starter/技术组件。更深层原理Spring Boot 的自动配置机制Spring Boot 每个 starter 都带有一个AutoConfiguration类它会读取application.properties中对应的配置项判断是否满足生效条件比如类路径上有某个类装配相应的 BeanSpring Boot 启动时先把所有配置文件读进 Environment然后自动配置类根据这些配置 类路径条件决定哪些 Bean 要创建。配置在前Bean 创建在后。2-4、yaml配置文件没有提示这是因为idea不认为yaml后缀的文件是一个配置文件。修改方式三、配置文件的位置优先级若是三种配置文件同时存在.properties, .yml, .ymal优先级是.properties .yml .ymal而且这三种配置文件的内容共存叠加相同覆盖根据优先级Spring Boot 会自动加载以下位置的配置文件优先级从高到低命令行参数例如--server.port8088application.properties或application.yml放在src/main/resources目录下是主配置文件它是默认的全局配置文件外部配置例如通过-Dspring.config.locationxxx指定四、多环境配置Profile你可以为不同环境配置不同的文件例如application-dev.ymlapplication-test.ymlapplication-prod.yml主配置文件中指定当前环境application.properties或者application.ymlspring: profiles: active: devSpring Boot 会自动加载application-dev.yml的配置。五、读取配置的方式1. 使用ValueValue(${server.port}) private int port;2. 使用ConfigurationProperties适合绑定一组配置my: app: name: hello version: 1.0Component ConfigurationProperties(prefix my.app) public class AppConfig { private String name; private String version; // getters and setters }作用在Spring Boot中我们通常会把配置信息写在application.yml或application.properties里。为了方便把一组配置映射到Java 对象中可以使用ConfigurationProperties注解。Component让 Spring 把这个类交给IOC 容器管理成为一个Bean可以在其他地方直接注入使用。不管是不是 Spring Boot 项目只要你想在别的地方用Autowired拿到这个类就必须让它进 IOC。【回顾】注解的区别本质 vs 语义Component最通用的注解表示这是一个组件。Service本质也是Component但语义化用来标识“业务逻辑层的类”。Controller也是Component语义是“控制层的类”同时还会结合 Spring MVC 处理请求。Repository也是Component语义是“数据访问层的类”并且附带异常转换功能。如果是接口就无效因为它不能自己生成实现类【注意】对于MyBatis项目Mapper基本上取代了Repository的注册作用。MapperMyBatis 提供的用于 Mapper接口让 MyBatis 知道这是个持久层接口同时 Spring 会注册成 Bean。【注意】推荐直接在接口上加Mapper或者在启动类上用MapperScan(com.xxx.mapper)。这样就不需要Repository了。ConfigurationProperties(prefix my.app)告诉 Spring Boot把配置文件中以my.app开头的属性自动绑定到这个类的字段。好处避免在代码中硬编码Value(${xxx})六、自定义配置和获取你也可以在 yml 配置文件中添加自定义属性例如custom: greeting: Hello, Spring Boot!【注意】1、值前面要有空格2、相同层级左对齐。3、大小写敏感6-1、数组或列表List的配置1、YAML 格式中的数组设置1、常用方式使用-符号列出元素2、另一种方式用逗号分隔字符串效果同上2、Properties 格式中的数组设置用逗号分隔值最常见方式my.servers192.168.0.1,192.168.0.2,192.168.0.3【注意】在 Java 中你可以用数组String[]或ListString来接收它。推荐用ListString更灵活。6-2、配置信息的获取1、通过Value(${键名})获取读取数组【修改以上图片的错误】1. 读取单个值Value(${enterprise.subject[1]}) private String subject01; // 只取 前端2. 读取整个数组Value(${enterprise.subject}) private String[] subjects; // [Java, 前端, 大数据]3.读取成 List更推荐Value(${enterprise.subject}) private ListString subjects;yml配置文件中的值相互引用${属性名}特殊字符转义用双引号包裹才会转义【Value获取配置信息的缺点】若是成员变量很多每个都要加Value会很麻烦。【办法】使用ConfigurationProperties(prefix 前缀)读取一组配置。2、ConfigurationProperties(prefix 前缀)读取将一组数据封装为一个对象这个对象要被spring识别要加上Component注解【注意】1、要让创建的对象被spring识别要加上Component2、application.yml / application.properties文件中的信息被修改了并不需要重新打包、部署项目代码只需要重启jar包即可。3、Environment对象Environment是什么Environment是 Spring 提供的一个核心接口它封装了应用的运行环境参数。其中包括application.properties/application.yml配置文件里的属性系统环境变量 (System Environment Variables)JVM 启动参数 (如-Dserver.port8081)以及其他外部配置源Spring Boot 的外部化配置机制。所以你不用手动去 newSpring Boot 在启动时会自动把所有可用的配置源加载到Environment。在 Spring Boot 里Environment就像一个统一的配置容器。七、总结功能推荐方式单个配置读取Value一组配置读取ConfigurationProperties多环境切换使用spring.profiles.active可读性建议使用application.yml八、springboot整合mybatis8-1、回顾spring整合mybatis8-2、springboot整合mybatis1、添加mybatis的起步依赖 数据库驱动依赖添加了mybatis的起步依赖之后mybatis以及相关的bean会被自动添加进项目中。项目中用到了这个父类这就意味着你自动继承了Spring Boot 官方提供的一个版本管理中心里面已经定义好了大量常用依赖的版本。具体定义了哪些依赖可以通过git上的查询到Spring Boot 使用的是Maven 的 dependencyManagement 机制这机制允许你不用显式写version只写groupId和artifactIdMaven 会自动使用父类定义的版本。mysql-connector-j可以不写版本因为 Spring Boot 官方已经在spring-boot-dependencies中管理了这个依赖的版本你可以省略versionMaven 会自动用 Spring Boot 推荐的版本比如8.0.33。mybatis-spring-boot-starter必须手动写版本这就不一定了。如果你用的是 Spring Boot2.x通常不会自动管理mybatis-spring-boot-starter。但 Spring Boot3.x如你写的 3.1.2是有管理的2、在配置文件application.yml中编写数据库相关信息。8-3、编写业务代码1、编写pojo类2、编写mapper接口3、编写service接口是实现类4、编写controller类九、springboot整合junit9-1、一般步骤创建一个springboot project默认就是导入了test依赖的这是因为springboot是maven项目maven项目是一定要执行测试操作的【注意】主要的核心类就是SpringBootTest加上这个注解这个类就是一个测试类9-2、测试类和引导类的位置关系在 Spring Boot 中测试类和引导类SpringBootApplication主类的位置关系直接影响到Spring 容器能否正常加载并注入依赖。建议测试类与引导类在同一个包或其子包下否则你必须手动指定扫描路径或配置上下文。包名要对得上示例在上面的例子中测试类在com.example.test启动类在com.example.app两者没有父子包关系test和app是平级测试类需要加载spring上下文环境才能Autowired 导入bean。解决方法1手动指定引导类方案 2将测试类放到启动类的包或其子包下方案 3使用 ContextConfiguration1.SpringBootApplication的启动类启动类一般放在项目的根包例如com.example.demo这样它就能通过包扫描找到所有子包里的Component、Service、Repository、Controller等 Bean。Spring Boot 默认是从启动类所在包开始向下扫描子包。2.SpringBootTest的测试类默认情况下SpringBootTest会尝试加载和测试类同包及其子包下的配置。测试类本身不需要被 Spring 扫描测试类是测试框架JUnit加载的不是 Spring 容器管理的 Bean测试类需要加载 Spring 上下文如果测试类和启动类不在一个包路径下Spring 可能找不到启动类导致上下文无法加载。如果测试类不在和启动类一致的包路径下可以在SpringBootTest里显式指定启动类。3、SpringBootTest的默认行为是它会尝试从测试类所在的包向上查找SpringBootApplication或SpringBootConfiguration标注的类如果找不到就会报错4、总结推荐做法启动类在根包测试类放在启动类的同包或子包下 → 自动能找到。如果不一致就在SpringBootTest(classes...)明确指定启动类。十、springboot整合mybatis-plus步骤一使用springboot的框架创建一个module步骤二添加mybatis-plus的依赖步骤三配置数据库相关属性步骤四编写dao接口继承basemapper【注意】此时运行测试程序会报错Invalid value type for attribute factoryBeanObjectType: java.lang.String问题原因 :更新的spring更改了factoryBean方法不再允许factoryBeanObjectType是String类型。导致老版本的mybatis不能兼容, 所以最新的mybatis3.0.3修复了这个问题, 然而mybatisplus中还未更新解决方案 :排除mybatilsplus自带的mybatils-spring重新引入十一、springboot整合druid或者