目录
①、在启动类中声明第三方bean:(以Dom4j:解析XML文件对象为例)
④、思考:@Component及衍生注解 与 @Bean注解使用场景?
②、自动配置常见方案1 —— @ComponentScan 组件扫描(不推荐)
③、自动配置常见方案2 —— @Import导入(普通类/配置类/ImportSelector接口实现类)
⑤、自动配置原理 -- 条件装配注解(@Conditional)
一、配置优先级
1、配置(3种:.properties、yml、yaml)
①、配置文件优先级
优先级最高的是(.properties > .yml > .yaml)
②、如何指定Java系统属性和命令行参数
program arguments 优先级比 VM options 要高
命令行执行:
示例:
Ⅰ、正常运行一个 jar 包: |
运行结果: |
Ⅱ、指定Java系统属性和命令行参数: |
③、5种配置文件的优先级
二、Bean管理
1、获取bean(3种方法)
默认情况下,SpringBoot项目在启动的时候会自动的创建IOC容器(也称为Spring容器),并且在启动的过程当中会自动的将bean对象都创建好,存放在IOC容器当中。应用程序在运行时需要依赖什么bean对象,就直接进行依赖注入就可以了。
代码示例:(3种获得bean对象的方法)
运行结果:(但现在我们获取的bean对象是同一个,是单例的,我们可以通过某些方法将它设置为非单例的) |
2、bean作用域(5种)
单例和多例取决于作用域
注意事项:
①、@Scope注解:配置作用域
测试代码:
Ⅰ、默认情况下:(单例) |
Ⅱ、懒加载: |
给DeptController类加上@Lazy注解,让其进行懒加载,即:不让Spring在程序启动时就实例化bean对象,而是在我们第一次请求它们时再创建: 测试结果:程序启动时,bean对象并没有被创建 当依次使用这个bean对象时,这个对象才进行实例化: |
Ⅲ、加上作用域@Scope("prototype"):表示每次使用bean时,都会创建新的实例 |
DeptController: 测试结果: |
3、第三方bean
以上bean对象以外的bean
注意事项:
①、在启动类中声明第三方bean:(以Dom4j:解析XML文件对象为例)
示例:
在启动类中声明第三方bean:(不建议使用这种方法) |
②、声明配置类来管理第三方bean对象
配置类示例: |
其次,我们可以通过@Bean注解的name/value属性来指定 bean的名称,如果未指定,默认是方法名: 测试bean对象的名称是否为方法名: 测试结果: |
③、如何在配置类中的第三方bean中引入方法对象
直接作为形参引入:
④、思考:@Component及衍生注解 与 @Bean注解使用场景?
三、SpringBoot原理
1、起步依赖
假如我们没有使用SpringBoot,用的是Spring框架进行web程序的开发,此时我们就需要引入web程序开发所需要的一些依赖。
spring-webmvc依赖:这是Spring框架进行web程序开发所需要的依赖 servlet-api依赖:Servlet基础依赖 jackson-databind依赖:JSON处理工具包 如果要使用AOP,还需要引入aop依赖、aspect依赖 项目中所引入的这些依赖,还需要保证版本匹配,否则就可能会出现版本冲突问题。 |
如果我们使用了SpringBoot,就不需要像上面这么繁琐的引入依赖了。我们只需要引入一个依赖就可以了,那就是web开发的起步依赖:springboot-starter-web。
起步依赖的原理就是依赖传递
2、自动配置
①、什么是自动配置?
示例:注入Gson对象
注入Gson对象: |
Ⅰ、编写测试类(AutoConfigurationTests),并在其中自动注入Gson对象: |
Ⅱ、运行结果: |
问题:在当前项目中我们并没有声明谷歌提供的Gson这么一个bean对象,然后我们却可以通过@Autowired从Spring容器中注入bean对象,那么这个bean对象怎么来的? |
答案:SpringBoot项目在启动时通过自动配置完成了bean对象的创建。 |
我们知道了什么是自动配置之后,接下来我们就要来剖析自动配置的原理。解析自动配置的原理就是分析在 SpringBoot项目当中,我们引入对应的依赖之后,是如何将依赖jar包当中所提供的bean以及配置类直接加载到当前项目的SpringIOC容器当中的。
②、自动配置常见方案1 —— @ComponentScan 组件扫描(不推荐)
示例:
单元测试:获取itheima-utils中的bean以及配置类: |
运行结果: |
③、自动配置常见方案2 —— @Import导入(普通类/配置类/ImportSelector接口实现类)
示例:
Ⅰ、在启动类中导入 普通类: |
Ⅱ、在启动类中导入 配置类:(多个Bean) |
Ⅲ、在启动类中导入 ImportSelector 接口实现类: |
ImportSelector 接口实现类: 启动类导入: |
Ⅳ、@EnableXxxx注解,封装了@Import注解(推荐) |
让第三方依赖自己来指定要导入哪些bean和配置类 在启动类上加上对应注解: |
④、自动配置原理 -- 源码跟踪
@interface SpringBootApplication: |
@SpringBootConfiguration注解上使用了@Configuration,表明SpringBoot启动类就是一个配置类 @Indexed注解,是用来加速应用启动的(不用关心)。 |
@interface EnableAutoConfiguratiion: |
⑤、自动配置原理 -- 条件装配注解(@Conditional)
示例:
@ConditionalOnClass:判断环境中是否有对应的字节码文件,才注册bean到IOC容器 |
@ConditionalOnMissingBean:判断环境中没有对应的bean(类型 或 名称),才注册bean到IOC容器(该注解的应用场景,通常是用来设置一个默认的bean对象) |
@ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器中 |
@Conditional小结
⑥、自动配置原理 —— 小结
自动配置的核心就在@SpringBootApplication注解上,SpringBootApplication这个注解底层包含了3个注解,分别是: - @SpringBootConfiguration - @ComponentScan - @EnableAutoConfiguration | |
@EnableAutoConfiguration这个注解才是自动配置的核心。
|
⑦、案例(自定义starter)
业务场景:
业务场景:
|
实现步骤:
Ⅰ、创建aliyun-oss-spring-boot-starter模块: |
由于aliyun-oss-spring-boot-starter模块只做依赖管理,所以其它文件就都可以删掉
|
Ⅱ、创建aliyun-oss-spring-boot-autoconfigure模块,在starter中引入该模块 |
|
Ⅲ、在aliyun-oss-spring-boot-autoconfigure模块中定义自动配置功能,并定义自动配置文件 META-INF/spring/xxxx.imports |
|
Ⅳ、功能测试: |
|
四、Web后端开发总结
1、三层架构
web后端开发现在基本上都是基于标准的三层架构进行开发的,在三层架构当中,Controller控制器层负责接收请求响应数据,Service业务层负责具体的业务逻辑处理,而Dao数据访问层也叫持久层,就是用来处理数据访问操作的,来完成数据库当中数据的增删改查操作。 在三层架构当中,前端发起请求首先会到达Controller(不进行逻辑处理),然后Controller会直接调用Service 进行逻辑处理, Service再调用Dao完成数据访问操作。 |
如果我们在执行具体的业务处理之前,需要去做一些通用的业务处理,比如:我们要进行统一的登录校验,我们要进行统一的字符编码等这些操作时,我们就可以借助于Javaweb当中三大组件之一的过滤器Filter或者是Spring当中提供的拦截器Interceptor来实现。 而为了实现三层架构层与层之间的解耦,我们学习了Spring框架当中的第一大核心:IOC控制反转与DI依赖注入 所谓控制反转,指的是将对象创建的控制权由应用程序自身交给外部容器,这个容器就是我们常说的IOC容器或Spring容器。 而DI依赖注入指的是容器为程序提供运行时所需要的资源。 |
除了IOC与DI我们还讲到了AOP面向切面编程,还有Spring中的事务管理、全局异常处理器,以及传递会话技术Cookie、Session以及新的会话跟踪解决方案JWT令牌,阿里云OSS对象存储服务,以及通过Mybatis持久层架构操作数据库等技术。 |
我们在学习这些web后端开发技术的时候,我们都是基于主流的SpringBoot进行整合使用的。而SpringBoot又是用来简化开发,提高开发效率的。像过滤器、拦截器、IOC、DI、AOP、事务管理等这些技术到底是哪个框架提供的核心功能?
|
在Spring框架的生态中,对web程序开发提供了很好的支持,如:全局异常处理器、拦截器这些都是Spring框架中web开发模块所提供的功能,而Spring框架的web开发模块,我们也称为:SpringMVC SpringMVC不是一个单独的框架,它是Spring框架的一部分,是Spring框架中的web开发模块,是用来简化原始的Servlet程序开发的。 外界俗称的SSM,就是由:SpringMVC、Spring Framework、Mybatis三块组成。 基于传统的SSM框架进行整合开发项目会比较繁琐,而且效率也比较低,所以在现在的企业项目开发当中,基本上都是直接基于SpringBoot整合SSM进行项目开发的。 |