Spring框架入门(二):IOC容器

一、IOC介绍

IOC:Inversion of Control 控制反转

​ spring核心容器也可以称为IOC容器,该容器主要负责管理各种对象,主要包括项目的生命周期(对象的创建、初始化、销毁等)、不同对象之间依赖关系的建立、将不同的对象及对象代码在程序运行期间动态的结合在一起等等。

​ IOC容器并没有实现更多的功能,但它的存在使我们不需要很多代码、不需要考虑对象间复杂的耦合关系就能从IOC容器中获取合适的对象,而且提供了各种对象的可靠的管理,极大地降低了开发的复杂性。

控制反转:是一种编程思想,或者说是一种新的设计模式,由于推出较晚,所以没有纳入GoF23种设计模式当中。

控制反转了什么呢?

  1. 不需要使用硬编码的方式创建对象;
  2. 不需要使用硬编码的方式维护对象之间的关系;

DI:Dependency Injection 依赖注入

​ DI的概念的提出是用来代替IOC的,表示让调用类对某一接口实现类的依赖关系由容器注入,以移除调用类对某一接口实现类的依赖。

依赖注入 这个名词显然比 控制反转 更直接明了,并且易于理解。 它是控制反转的一种实现方式,并不是唯一的方式,例如:依赖查找、服务定位器、容器注入、策略模式和观察者模式等,也可以实现控制反转。

二、IOC容器

​ Spring的IoC(Inversion of Control,控制反转)之所以又称为IoC容器,主要是因为IoC在Spring框架中承担了一个核心的角色——作为容器来管理应用程序中的对象(通常称为Bean)。

​ Spring提供了两种主要的IoC容器实现:BeanFactoryApplicationContext

  1. BeanFactory
    1. 是Spring中最基础的IoC容器接口,提供了IoC服务的基本支持。
    2. 主要用于访问容器中的Bean,但功能相对简单,不提供诸如国际化、事件发布等高级功能。
  2. ApplicationContext
    1. BeanFactory的子接口,提供了更丰富的功能,如国际化、资源访问、事件发布等。
    2. 是Spring框架推荐使用的IOC容器实现,因为它提供了比BeanFactory更全面的服务支持。

核心API

// 根据指定名称返回一个Bean实例
Object getBean(String name)

// 判断名称为name的Bean是否是原型,即是否总是返回一个新实例(非单例)
boolean isPrototype(String name)

// 判断名称为name的Bean是否是单例
boolean isSingleton(String name)
 
// 判断容器中是否包含给定名称的Bean实例
boolean containsBean(String name)

// 如果名称为name的Bean有别名则返回其别名
String[] getAliases(String name)

三、IOC的注入功能

1. set方式注入(必须依靠set方法)

1)基本类型的装配

XML配置

<bean id="student" class="com.it.bean.Student">
    <property name="id" value="001"></property>
    <property name="age">
        <value>23</value>
    </property>
</bean>

java配置类

@Bean
public Student student() {
   
    Student student = new Student();
    student.setName("name");
    student.setAge(18);
    return student;
}

注意:

  1. id:是Bean的唯一标识,要求在整个配置文件中要唯一,也可使用name属性,bean标签里面的id和name属性都可以用来标识这个配置的对象,但是id会帮我们检查给对象起的名字是否规范(名字不能重复、不能用数字开头、不能有空格等等),如果检查出来了就会报错,而name属性不会检查这些东西;

    XML配置

    <bean name="t1 t2" class="com.it.bean.Teacher"></bean>
    
    <bean id="t1 t2" class="com.it.bean.Teacher"></bean>
    

    java配置类

    @Bean(name = {
         "stu", "student", "s"})
    public Student student() {
         
        return new Student();
    }
    
  2. property:对于所有用set方式来注入的必须使用该标签。

  3. value:基本数据类型,都用value(标签/属性)来注入,可以实现自动的数据类型转换。

2)对象类型的装配

  1. 引用对象在当前配置文件中:

    <property name="student">
        <ref local="objName"/>
    </property>
    
  2. 引用对象不在当前配置文件中:

    <property name="student">
        <ref bean="objName"/>
    </property>
    
  3. 使用property的ref属性引用:

    <property name="student" ref="objName"></property>
    

3)集合的装配

  1. List集合:

    <!-- 使用value注入 -->
    <property name="list">
        <list>
            <value>hello1</value>
            <value>hello2</value>
            <value>hello3</value>
        </list>
    </property>
    
    <!-- 使用ref引用spring容器中的其他对象 -->
    <property name="list">
        <list>
            <ref bean="t1"/>
            <ref bean="t2"/>
        </list>
    </property>
    
  2. Set集合:

    <property name="set">
        <set>
            <va
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风於尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值