写点什么

华为大佬怒肝 1 个月源码,贡献出这份 Spring Framework 使用技巧

发布于: 2021 年 06 月 16 日
华为大佬怒肝1个月源码,贡献出这份Spring Framework使用技巧

今日分享开始啦,请大家多多指教~

Spring 是什么?

  • Spring 是什么呢?我们可看一下官网的定义:

  • Spring 快速、容易、安全,专注速度,开发效率高,Spring 是全世界最流行的 Java 开发框架。

Spring Framework 框架

Spring Framework 是 Spring 中的核心框架,结构如下所示:

Core Container(核心容器)模块主要是四部分构成:

  • Sping-Beans

  • Spring-Core

  • Spring-Context

  • Spring-Expression Language

1.IoC 容器

IoC(Inversion of Control)称为控制反转,是面向对象编程中的一种设计原则,主要用来降低代码之间的高耦合度问题。

从使用上看,使用 IoC 之前,创建对象需要手动 new 对象,并设置对象属性,控制权掌握在应用程序自身(对象的创建与销毁都掌握在我们自己手中);使用 IoC 之后,对象的控制权交给了第三方进行管理,这里的第三方就是容器,因而对象由容器来管理。因为发生了控制权的反转,所以叫控制反转。

2.DI(依赖注入)

DI(Dependency)称为依赖注入,是实现 IoC 的方法之一,所谓依赖注入就是指 IoC 容器运行期间,动态地将某种依赖关系注入到对象到中。

3.IoC 与 DI 关系

实际上,IoC 与 DI 是从不同角度描述的同一件事情,当引入 IoC 容器后,使用依赖关系注入的方式,实现了对象之间的解耦。

接下来主要针对 Sping-Beans 与 Spring-Context 进行介绍:

Spring 容器的 API 有 BeanFactory 和 ApplicationContext 两大类,二者都是顶级接口,其中 ApplicationContext 是 BeanFactory 的顶级接口。接下来的代码演示部分,我们都基于 ApplicationContext 应用上下文接口去实现容器。

我们先基于 Maven 创建 Spring 项目,具体步骤如下:

1.创建 Maven 项目后,在 pom.xml 配置文件中引入外部依赖,刷新 Maven 面板


2.准备项目启动类入口

将 beans.xml 文件作为参数对 ClassPathXmlApplicationContext 类进行实例化操作,构建一个 ApplicationContext 对象。

3.定义 Spring 配置文件(这里指的就是 beans.xml)

在 src/main/resources/下创建 beans.xml 文件,写入内容

<context:component-scan base-package="org.example"/>

base-package:表示的是 Spring 启动时候扫描的包路径,该路径下带有类注解的类将被注册到容器里。

4.扫描 Spring 类注解注册 Bean 对象

类注解方式:共有 4 种类注解,它们虽然对应不同的业务,但是都是为 Spring 容器服务的;类注解定义方式默认会注册类名首字母小写的 Bean 对象到容器中。

  • @Controller :前端业务交互(参数校验)

  • @Service :业务处理中间类(业务逻辑处理)

  • @Repository :数据持久层(增删查改)

  • @Component :通用对象工具类(比如数据序列化、反序列化操作)

5.得到容器中 Bean 对象

第一种得到 Bean 对象方式:


需要特别注意的是:getBean 方法中的参数首字母一定是小写的(源码表示启动类名首字母小写),否则代码引发异常。

第二种得到 Bean 对象方式:


从代码执行的结果可以看出:Bean 对象被正常打印出来

两种方式拿到的对象是否一样呢?


从结果可以看出两种方式获得的对象是同一个 Bean 对象,这是因为 Spring 使用了单例模式。

特殊情况:当注解类前两个字母都为大写时,传入的参数为原来的类名



从代码执行结果来看,此时 getBean 方法传入的参数要求是原来的类名。

Lombok 依赖

当在 beans.xml 中添加了 Lombok 依赖时,需要安装 Lombok 插件

Lombok 使用演示:

对上面代码 build 操作后,可以发现自动生成了三种方法

Lombok 原理:它是自定义注解的方式,在代码编译时期,将自定义的注解更换成了 JVM 可以执行的方法(就是 get、set、toString 方法)。

注册 Bean 的方式

1.类注解

上面已经阐述,此处不再赘述。

2.@Bean 注解

当前类被 Spring 扫描时,可以在方法上使用 @Bean 注解,通过方法返回类型,可以定义、注册 Bean 对象,默认使用方法名作为 Bean 的名称。

在 LoginController 中定义两个 User 方法:



从结果可以看出 @Bean 方法注解成功注册了 Bean 对象。

那么能不能以同样的方式(或者 Use.class 方式)传入 user2 拿到 Bean 对象?

答案:不行,因为 user1 和 user2 方法返回的都是 User 类型,容器中注册的 Bean 对象有两个。

如何得到 user2 的 Bean 对象呢?

首先在 LoginController 类上加入 Getter 注解。


3.@Configuration 注解

当类被 Spring 扫描时,使用 @Configuration 注解,可以注册一个配置类到容器中,配置类一般用来自定义配置某些资源。


从结果可以看出,使用 Configuration 注解注册了 Bean 对象。

依赖注入的方式

1.属性注入




结果说明在 LoginController 类中,通过属性注入的方式,可以得到 Bean 对象。

2.set 方法注入

3.构造方法注入

三种注入方式比较来看,属性注入的方式是最简洁的。

4.指定注入:@Qualifier

当同类型的 Bean 有多个时,注入该类型 Bean 需要指定 Bean 的名称:

  • 属性名或方法参数名设置为 Bean 的名称;

  • 属性名或方法参数设置 @Qualifier(“名称”)注解,注解内的字符串是 Bean 对象的名称。

Bean 的作用域

Spring 容器在初始化一个 Bean 对象时,同时会指定该对象的作用域,一共有 6 种作用域,接下来我们分别来看:

1.singleton

该作用域为单例模式作用域,Bean 在 IoC 容器中只有一个实例对象,获取 Bean(getBean)以及装配 Bean(@Autowired)都是同一个对象。Spring 容器默认默认选择的是 singleton 作用域。

2.prototype

每次该作用域下 Bean 的请求都会创建新的实例,也就是说每一次的获取 Bean 和装配 Bean 都是新的对象。通常有状态的 Bean 使用该作用域。

3.request

每次 http 请求都会创建新的 Bean 实例;适用场景:一次 http 请求和响应的共享 Bean;限定在 SpringMVC 中使用。

4.session

在一个 http 的 session 中定义一个 Bean 实例;场景:http 的 session 会话中记录一个用户的登录信息;限定在 SpringMVC 中使用。

5.application

在一个 http servlet Context 中,定义一个 Bean 实例;场景:Web 应用的全局上下文信息,比如记录一个应用的共享信息;限定在 SpringMVC 中使用。了解即可

6.websocket

在一个 http WebSocket 的生命周期中,定义一个 Bean 实例;场景:WebSocket 的每次会话中,保存了一个 Map 结构的头信息,用来包裹客户端的消息头,第一次初始化后,直到 WebSocket 结束都是一个 Bean;限定在 Spring WebSocket 中使用。

Bean 生命周期

生命周期图

Bean 的生命周期主要步骤:

1.实例化 Bean:通过反射机制调用构造方法实例化对象;

2.依赖注入:装配 Bean 的属性;

3.实现了 Aware 接口的 Bean,执行接口的方法:顺序执行 BeanNameAware、BeanFactoryAware、ApplicationContextAware 的接口方法;

4.Bean 对象初始化之前,循环调用实现了 BeanPostProcessor 接口的预初始化方法 postProcessBeforeInitialization;

5.Bean 对象初始化:顺序执行 @PostConstruct 注解方法、InitializingBean 接口方法、init-method 方法;

6.Bean 对象初始化后,循环调用实现了 BeanPostProcessor 接口的后初始化方法

postProcessAfterInitialization;

7.容器关闭时调用 Bean 对象的销毁方法,顺序:@PreDestroy 注解方法、@DisposableBean 接口方法、destory-method。

今日份分享已结束,请大家多多包涵和指点!

用户头像

还未添加个人签名 2021.04.20 加入

Java工具与相关资料获取等WX: pfx950924(备注来源)

评论

发布
暂无评论
华为大佬怒肝1个月源码,贡献出这份Spring Framework使用技巧