Spring注解驱动开发第2讲——使用@Configuration和@Bean给容器中注册组件
发布日期:2021-06-30 17:55:55 浏览次数:2 分类:技术文章

本文共 7463 字,大约阅读时间需要 24 分钟。

写在前面

在以前学习Spring的过程中,我们是通过编写XML配置文件来定义我们的bean的,这种编写XML配置文件的方式不仅繁琐,而且还很容易出错,稍有不慎就会导致编写的应用程序各种报错,排查半天,发现是XML文件配置不对!另外,每个项目都编写大量的XML文件来配置Spring,也大大增加了项目维护的复杂度,往往很多个项目的Spring XML文件的配置大部分是相同的,只有很少量的配置不同,这也造成了配置文件上的冗余。

而要是使用了Spring注解驱动来开发,你会发现以上这些问题都将不存在了。整个世界都变得清静了,于是你不由得会心一笑😊!这也导致了学习Spring注解驱动开发是一件多么迫不急待地事,正如教员说的那句话:

多少事,从来急。天地转,光阴迫。一万年太久,只争朝夕!

我喜欢教员!毛选第一卷还看了一大部分。我还非常喜欢国际歌,特别喜欢第六段:

是谁创造了人类世界?

是我们劳动群众!
一切归劳动者所有,
哪能容得寄生虫?
最可恨那些毒蛇猛兽,
吃尽了我们的血肉!
一旦把它们消灭干净,
鲜红的太阳照遍全球!

鲜红的太阳必将照遍全球!!!

Spring IOC和DI

在Spring容器的底层,最重要的功能就是IOC和DI,也就是控制反转和依赖注入。

在这里插入图片描述
DI和IOC它俩之间的关系是DI不能单独存在,DI需要在IOC的基础上来完成。

在Spring内部,所有的组件都会放到IOC容器中,组件之间的关系通过IOC容器来自动装配,也就是我们所说的依赖注入。接下来,我们就使用注解的方式来完成容器中组件的注册、管理及依赖、注入等功能。

在介绍使用注解完成容器中组件的注册、管理及依赖、注入等功能之前,我们先来看看使用XML配置文件是如何注入bean的。

通过XML配置文件注入JavaBean

首先,新建一个maven项目,例如spring-annotation-liayun,注意其打包方式是jar。

在这里插入图片描述
这个时候我们发现新建的maven项目的编译版本是1.5。那这还玩个毛啊!要知道现在都2020年末了,都快出Java 16这个版本了,但为了稳定,公司里面现在普遍使用的都是Java 8,所以在这里我们需要设置编译版本为1.8,即在pom文件中添加maven插件指定编译时候使用的JDK版本。

org.apache.maven.plugins
maven-compiler-plugin
3.5.1
1.8
1.8
UTF-8

以上只是调整局部JDK版本。这时,你会发现新建的maven项目依然会报错,如下图所示。

在这里插入图片描述
这个报错你也不用担心,因为有时候加依赖或者插件,maven项目就会报错。这时,就需要时不时地Update一下项目了,Update项目之后,你就会发现项目的编译版本为1.8了,如下图所示。
在这里插入图片描述
然后,在pom文件中添加对Spring的依赖,注意咱们在这儿使用的Spring是4.3.12.RELEASE这个版本的。

org.springframework
spring-context
4.3.12.RELEASE

接着,在工程的com.meimeixia.bean包下创建一个Person类,作为测试的JavaBean,代码如下所示。

package com.meimeixia.bean;public class Person {
private String name; private Integer age; public String getName() {
return name; } public void setName(String name) {
this.name = name; } public Integer getAge() {
return age; } public void setAge(Integer age) {
this.age = age; } public Person(String name, Integer age) {
super(); this.name = name; this.age = age; } public Person() {
super(); // TODO Auto-generated constructor stub } @Override public String toString() {
return "Person [name=" + name + ", age=" + age + "]"; } }

紧接着,在工程的src/main/resources目录下创建Spring的配置文件,例如beans.xml,通过该配置文件将Person类注入到Spring的IOC容器中,该配置文件中的内容如下所示。

至此,我们使用XML配置文件的方式注入JavaBean就完成了。

接下来,我们在工程的com.meimeixia包下创建一个MainTest类来进行测试,该类的代码如下所示。

package com.meimeixia;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.meimeixia.bean.Person;public class MainTest {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); Person person = (Person) applicationContext.getBean("person"); System.out.println(person); } }

运行以上main方法,输出的结果信息如下图所示。

在这里插入图片描述
从输出结果中,我们可以看出,Person类通过beans.xml文件的配置,已经注入到Spring的IOC容器中去了。

通过注解注入JavaBean

通过XML配置文件的方式,我们可以将JavaBean注入到Spring的IOC容器中。那使用注解又该如何实现呢?别急,其实使用注解比使用XML配置文件要简单的多,我们在项目的com.meimeixia.config包下创建一个MainConfig类,并在该类上添加@Configuration注解来标注该类是一个Spring的配置类,也就是告诉Spring它是一个配置类,最后通过@Bean注解将Person类注入到Spring的IOC容器中。

package com.meimeixia.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import com.meimeixia.bean.Person;/** * 以前配置文件的方式被替换成了配置类,即配置类==配置文件 * @author liayun * */// 这个配置类也是一个组件 @Configuration // 告诉Spring这是一个配置类public class MainConfig {
// @Bean注解是给IOC容器中注册一个bean,类型自然就是返回值的类型,id默认是用方法名作为id @Bean public Person person() {
return new Person("liayun", 20); } }

没错,通过MainConfig类我们就能够将Person类注入到Spring的IOC容器中,是不是很Nice啊!!主要是我们在类上加上@Configuration注解,并在方法上加上@Bean注解,就能够将方法中创建的JavaBean注入到Spring的IOC容器中。

然后,我们修改MainTest类中的main方法,以测试通过注解注入的Person类,如下所示。

package com.meimeixia;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.meimeixia.bean.Person;import com.meimeixia.config.MainConfig;public class MainTest {
public static void main(String[] args) {
// ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");// Person person = (Person) applicationContext.getBean("person");// System.out.println(person); ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class); Person person = applicationContext.getBean(Person.class); System.out.println(person); } }

再次运行以上main方法,输出的结果信息如下图所示。

在这里插入图片描述
可以看出,通过注解将Person类注入到了Spring的IOC容器中。

到这里,我们已经明确了,通过XML配置文件和注解这两种方式都可以将JavaBean注入到Spring的IOC容器中。那么,使用注解将JavaBean注入到IOC容器中时,使用的bean的名称又是什么呢?我们可以在MainTest类的main方法中添加如下代码来获取Person这个类型的组件在IOC容器中的名字。

// Person这个类型的组件在IOC容器中的名字是什么呢?String[] namesForType = applicationContext.getBeanNamesForType(Person.class);for (String name : namesForType) {
System.out.println(name);}

这样,MainTest类的main方法的完整代码如下所示。

package com.meimeixia;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.meimeixia.bean.Person;import com.meimeixia.config.MainConfig;public class MainTest {
public static void main(String[] args) {
// ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");// Person person = (Person) applicationContext.getBean("person");// System.out.println(person); ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class); Person person = applicationContext.getBean(Person.class); System.out.println(person); // Person这个类型的组件在IOC容器中的名字是什么呢? String[] namesForType = applicationContext.getBeanNamesForType(Person.class); for (String name : namesForType) {
System.out.println(name); } } }

运行以上main方法之后,输出的结果信息如下图所示。

在这里插入图片描述
那这里打印出的person到底是啥呢?我们修改下MainConfig类中的person()方法,将其名字修改成person01,如下所示。

package com.meimeixia.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import com.meimeixia.bean.Person;/** * 以前配置文件的方式被替换成了配置类,即配置类==配置文件 * @author liayun * */// 这个配置类也是一个组件 @Configuration // 告诉Spring这是一个配置类public class MainConfig {
// @Bean注解是给IOC容器中注册一个bean,类型自然就是返回值的类型,id默认是用方法名作为id @Bean public Person person01() {
return new Person("liayun", 20); } }

此时,我们再次运行MainTest类中的main方法,输出的结果信息如下图所示。

在这里插入图片描述
看到这里,大家应该有种豁然开朗的感觉了,没错!!使用注解注入JavaBean时,bean在IOC容器中的名称就是使用@Bean注解标注的方法名称。我们可不可以为bean单独指定名称呢?那必须可以啊!只要在@Bean注解中明确指定名称就可以了。比如在下面MainConfig类的代码中,我们将person01()方法上的@Bean注解修改成了@Bean(“person”)注解,如下所示。

package com.meimeixia.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import com.meimeixia.bean.Person;/** * 以前配置文件的方式被替换成了配置类,即配置类==配置文件 * @author liayun * */// 这个配置类也是一个组件 @Configuration // 告诉Spring这是一个配置类public class MainConfig {
// @Bean注解是给IOC容器中注册一个bean,类型自然就是返回值的类型,id默认是用方法名作为id @Bean("person") public Person person01() {
return new Person("liayun", 20); } }

此时,我们再次运行MainTest类中的main方法,输出的结果信息如下图所示。

在这里插入图片描述
可以看到,此时,输出的JavaBean的名称确实是person了。

小结

我们在使用注解方式向Spring的IOC容器中注入JavaBean时,如果没有在@Bean注解中明确指定bean的名称,那么就会使用当前方法的名称来作为bean的名称;如果在@Bean注解中明确指定了bean的名称,那么就会使用@Bean注解中指定的名称来作为bean的名称。

转载地址:https://liayun.blog.csdn.net/article/details/110219560 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Spring注解驱动开发第3讲——使用@ComponentScan自动扫描组件并指定扫描规则
下一篇:Spring注解驱动开发第1讲——今天,我们来聊聊关于Spring注解驱动开发的那些事儿!

发表评论

最新留言

很好
[***.229.124.182]2024年05月01日 14时07分16秒