使用Spring的IOC特性

使用Spring的IOC特性

前言

我本人接触后台开发也有一段时间了,现在计划写一系列关于Spring全家桶的文章,从Spring Framework开始,到Spring Boot和Spring Cloud,一方面做一些知识输出,一方面用于记录学习情况,也方便平时速查。当然后续还有更多其他关于后台技术的使用的文章,这个要看我的个人时间安排。

我不想介绍太多关于底层实现的东西,那些东西可以从网上一些带人看源码的文章和视频找到,或者一些教人面试的八股文也有,我只介绍框架的最基本,最实用的使用方法,而且一些冷门的,过时的部分我也不介绍了,可能大家会觉得我的文章比较浅,而我旨在写一些Quick Start型的文章,让大家可以快速入门。

好的,让我们开始吧!

搭建一个Spring项目

在这里插入图片描述

根据官方文档,如果我们要使用Spring,只需要搭建一个Spring Boot项目就行了,这是官方推荐的使用方式,因此在这我不再挨个导入Spring的每个jar包,而是直接创建一个Spring Boot项目

这是一个基于Spring的脚手架,可以帮助我们快速搭建Spring项目

我们借助idea的创建界面来快速创建一个Spring项目

在这里插入图片描述

这是一个Maven项目,从pom.xml可以看到我的Spring Boot版本是2.3.7,打开可以看到Spring的版本是5.2.12

在这里插入图片描述

在这里插入图片描述

这样我们的Spring项目就搭建好了,关于Spring Boot,后续的系列文章会介绍,我们现在只使用Spring的相关特性

使用注解开发

关于Spring开发有两种驱动方式,一种是基于Xml文件配置,一种是基于注解,我只介绍后者,毕竟注解开发现在才是主流

向IOC容器中添加Bean

在Spring中,容器中的每一个组件称为Bean,有两种方式可以向IOC容器添加Bean

首先我们定义一个实体类,然后我们将这个类的对象加入IOC容器

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    private int age;
    private String name;
}

使用@Configuration+@Bean的方式

@Configuration
public class MyConfiguration {

    @Bean
    public Person person(){
        return new Person(18,"wang");
    }
}

创建一个自定义配置类,将@Configuration添加到自定义配置类上,创建一个方法,将@Bean添加到方法上,该方法返回一个对象,也就是Bean,这就完成了组件的添加

注意这里的方法名即为默认的Bean的名字

使用@Component的方式

@Data
@NoArgsConstructor
@AllArgsConstructor
@Component
public class Person {
    private int age = 18;
    private String name = "wang";
}

@Component添加在组件的类上,即可完成组件的添加,Bean的名字为类名(首字母小写)

其实打开@Configuration的底层,会发现@Configuration其实也是@Component

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";

    boolean proxyBeanMethods() default true;
}

@Component还有三个衍生注解@Controller @Service @Repository,他们的作用相同,只是在项目中为了区分三层关系,并且也方便使用Spring的组件过滤进行过滤

那我们什么时候使用第一种方式,什么时候使用第二种方式呢?一般来说,我们自己定义的组件,使用@Component来添加Bean,如果需要添加第三方导入的组件,在导入jar包后使用@Configuration+@Bean来添加Bean

从IOC容器中获取Bean

默认情况下,Bean在IOC容器下是单例的,我们可以使用@Autowired来获取Bean,@Autowired会根据类型在IOC容器中获取这个单例的Bean

@SpringBootTest
class DemoApplicationTests {

    @Autowired
    Person person;

    @Test
    void contextLoads() {
        System.out.println(person);
    }

}

在Spring Boot提供的测试框架中,测试获取IOC容器中的Bean,将@Autowired添加在成员变量上,完成注入,该成员变量的变量名为Bean的名字

在单例模式下,由于@Autowired会根据类去寻找Bean,则此时变量名无关,但是在使用别的方式比如使用Bean的名字获取Bean时,变量名需要和Bean的名字匹配

测试的结果以上两种添加Bean的方式均可以获取到Bean
在这里插入图片描述

至此基于Spring框架注解实现IOC特性的简单演示完成,项目中的组件,一次添加到IOC容器中,在项目的其他位置可以随意地取出,使得项目的组件依赖关系解耦,也方便扩展

required属性

@Autowired注解中有一个required属性,默认为true,表示IOC容器中必须有该类型的Bean,否则报错,如果自动注入的成员变量允许为null,可以将required设置为false,此时如果IOC容器中找不到匹配的Bean,则将值设置为null而不报错

@SpringBootTest
class DemoApplicationTests {

    @Autowired(required = false)
    Person person;


    @Test
    void contextLoads() {
        System.out.println(person);
    }

}

IOC容器

最后再介绍一下,Spring的IOC容器具体是什么呢?其实官方文档一开头就给出了解释

在这里插入图片描述

BeanFactory这个接口,更具体地,是ApplicationContext这个子接口

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值