SpringBoot-IOC对Bean的管理以及Bean的定义

1. 前言

Spring有跟多概念,其中最基本的一个就是bean,那到底spring bean是什么 Bean是Spring框架中最核心的两个概念之一(另一个是面向切面编程AOP) 是否正确理解 Bean 对于掌握和高效使用 Spring 框架至关重要

2. Bean定义

springboot的官方文档表示:

In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.

翻译过来即是:

bean是构成程序主干的对象,并且这些对象是由IOC容器进行管理的

这就有点像面向对象的概念,即是整个程序是由一个一个对象相互作用形成的,所以,bean可以理解为是一个一个的java对象

3. IOC

3.1 定义

控制反转英文全称:Inversion of Control,简称就是IoC

控制反转是通过依赖注入的方式实现对象之间的松耦合关系,Martin Fowler 在04年发表的一篇博客上说到,他更愿意将spring框架中的控制反转称为是依赖注入

3.2 解释

所谓控制反转,即将系统中某些控制的能力反转了,举个不恰当的例子:
小明养了小狗,小明对像狗有“控制权”,那么当控制反转,小狗反过来对小明有了控制权

在原本的java程序中,用户可以根据类new出一个又一个的对象以便执行自己需要的操作,new不new对象完全是由用户自己决定的,而在IOC模式下,对象的建立是由IOC容器来管理的。

再举个例子:

一共有A,B两个类,A类中的成员变量包含了B这个类,在平常的java程序中,我们至少需要在A类的构造方法或者成员方法中有一个new出B这个对象的过程(假设A类的任何操作都需要用到B实例化的对象),才能正常执行A对象的各种操作,这在java中被成为是“组合”【面向对象课程学到的新名词】;但是在控制反转中,用户不需要自己new一个对象,你只需要在合适的类中注册bean,交给IOC容器管理,然后再你要用到的时候使用bean,也就是说,IOC容器会帮助你new出这个对象

3.3 依赖注入

在这里,依赖就好比是上面例子所说的 B就是A的一个依赖,IOC会在创建A类对象的时候自动创建A中的B对象,这个过程称为依赖注入。
从某种层面上来说,依赖,Bean,对象 可以视为同一种东西。

Spring 启动时会把所需的类实例化成对象,如果需要依赖,则先实例化依 赖,然后实例化当前类。因为依赖必须通过构建函数传入,所以实例化时,当前类就会接收并保存所有依赖的对象。这一步也就是所谓的依赖注入

3.4 控制反转的作用

在博客园中有一位博主的写的博客解释得很生动,在控制反转之前,所有得类都是相互耦合得,就像一个机器的某一块部位的几个齿轮相互咬合,并且基本两两之间都有接触,在控制反转之后,这几个对象之间就多了一个较大的齿轮,即IOC容器,每个类都只需要和IOC容器进行交互,从而达到了解耦合的这么一个效果,尤其是在大的项目中,优势应该体现的很明显,小的项目其实无所谓,(本来应该在文末表明这位博主的博客地址,但是不巧博客园正在整改。。。今天中午才开始,改完了之后会加到文末)

3.5 总结

在Spring 中,类的实例化、依赖的实例化、依赖的传入都交由 Spring Bean 容器控制,而不是用new方式实例化对象、通过非构造函数方法传入依赖等常规方式。实质的控制权已经交由程序管理,而不是程序员管理,所以叫做控制反转。

4. Bean在spring中的使用

4.1 注册bean(基于注解)

@Component、@Repository、 @Service、 @Controller 、 @Configuration @Bean

以上注解(除了@Bean)均能够注册一个bean交给IOC容器管理

这些注解都使用在类上,将类标识为Bean,由Spring扫描到后会生成一个单例bean放到容器中。

但他们也有一些区别:

  • @Component:当类不好划为其他类别的时候就是用@Component标识
  • @Repository、@Service、@Controller 都包含@Component注解
  • @Repository 用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件
  • @Service :用于标注服务层,主要用来进行业务的逻辑处理
  • @Controller: 通常作用在控制层
  • @Configuration,在@Component的基础上,会对修饰的类做一个增强
  • @Bean :至于@Bean注解呢,是作用在方法上的,同样能够产生一个bean交给IOC容器管理
  • @configuration:@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法

4.2 使用bean

  • @Autowired注解:在需要使用到已经注册了的bean的类中使用该注解能够拿到该Bean,并在该类中使用拿到的bean
  • @Resource:同上
  • 二者区别:@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入 (更加具体的可以参照下方的参考文章)

4.3 bean的实现代码展示

  1. 编写实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class Guest {
    private int id;
    private String name;
    private int age;
    
    @Override
    public String toString() {
        return "Guest{" +
                "id='" + id + '\'' +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
  1. 编写配置类
@Configuration
public class GuestConfig {
    @Bean
    public Guest getGuest1(){
        return new Guest(1,"niu",18);
    }
}
  1. 编写测试类
public class TestConfig {

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(GuestConfig.class);
        Guest guest = context.getBean(Guest.class);
        System.out.println(guest);

        String[] guests = context.getBeanNamesForType(Guest.class);
        for (String s : guests) {
            System.out.println(s);
        }
    }
}
  1. 输出结果
    在这里插入图片描述

参考文章:

  1. spring bean是什么
  2. Inversion of Control Containers and the Dependency Injection pattern
  3. @Autowired和@Resource的区别
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值