【Spring】04 Spring IOC 容器是指

一、介绍

1、BeanFactory是Spring 底层IOC容器

2、ApplicationContext是具备应用特性的BeanFactory超集

二、Spring IOC 配置元信息

1、Bean 定义配置

基于XML 文件、基础Properties文件、基于Java 注解、基于Java API

2、IOC 容器配置

基于XML 文件、基于Java 注解、基于Java API

3、外部化配置属性

基于Java 注解

三、Spring应用上下文

1、ApplicationContext 除了IOC 容器角色

面向切面(AOP)

配置元信息(Configuration Metadata)

资源管理(Resources)

事件(Events)

国际化(i18n)

注解(Annotations)

Envionment 抽象(Environment Abstraction)

四、Spring IOC 容器生命周期

1、启动

2、运行

3、停止

五、BeanFactory 与 FactoryBean

1、BeanFactory 是IOC 底层容器

2、FactoryBean 是创建Bean 的一种方式,帮组实现复杂的初始化逻辑

六、Spring IOC 容器启动时做了那些准备

1、IOC 配置元信息读取和解析、IOC 容器生命周期、Spring 事件发布、国际化

2、IOC 是反转控制、主要有依赖查找和依赖注入实现

3、依赖查找和依赖注入的区别

  1. 依赖查找是主动或手动的依赖查找方式、通常需要依赖容器或标准API 实现。
  1. 依赖注入则是手动或自动依赖绑定的方式,无需依赖特定的容器和API

4、Spring 作为IOC容器有什么优势

典型的IOC 管理,依赖查找、依赖注入

AOP 抽象、事务抽象、事件机制、SPI 扩展、强大的第三方整合、易测试性、更好的面向对象

六、代码

1、BeanFactory

/**
 * {@link BeanFactory} 作为 IoC 容器示例
 *
 * @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
 * @since
 */
public class BeanFactoryAsIoCContainerDemo {

    public static void main(String[] args) {
        // 创建 BeanFactory 容器
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
        // XML 配置文件 ClassPath 路径
        String location = "classpath:/META-INF/dependency-lookup-context.xml";
        // 加载配置
        int beanDefinitionsCount = reader.loadBeanDefinitions(location);
        System.out.println("Bean 定义加载的数量:" + beanDefinitionsCount);
        // 依赖查找集合对象
        lookupCollectionByType(beanFactory);
    }

    private static void lookupCollectionByType(BeanFactory beanFactory) {
        if (beanFactory instanceof ListableBeanFactory) {
            ListableBeanFactory listableBeanFactory = (ListableBeanFactory) beanFactory;
            Map<String, User> users = listableBeanFactory.getBeansOfType(User.class);
            System.out.println("查找到的所有的 User 集合对象:" + users);
        }
    }

}

2、Annotation


import org.geekbang.thinking.in.spring.ioc.overview.domain.User;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Map;

/**
 * 注解能力 {@link ApplicationContext} 作为 IoC 容器示例
 *
 * @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
 * @since
 */
@Configuration
public class AnnotationApplicationContextAsIoCContainerDemo {

    public static void main(String[] args) {
        // 创建 BeanFactory 容器
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        // 将当前类 AnnotationApplicationContextAsIoCContainerDemo 作为配置类(Configuration Class)
        applicationContext.register(AnnotationApplicationContextAsIoCContainerDemo.class);
        // 启动应用上下文
        applicationContext.refresh();
        // 依赖查找集合对象
        lookupCollectionByType(applicationContext);

        // 关闭应用上下文
        applicationContext.close();

    }

    /**
     * 通过 Java 注解的方式,定义了一个 Bean
     */
    @Bean
    public User user() {
        User user = new User();
        user.setId(1L);
        user.setName("小马哥");
        return user;
    }

    private static void lookupCollectionByType(BeanFactory beanFactory) {
        if (beanFactory instanceof ListableBeanFactory) {
            ListableBeanFactory listableBeanFactory = (ListableBeanFactory) beanFactory;
            Map<String, User> users = listableBeanFactory.getBeansOfType(User.class);
            System.out.println("查找到的所有的 User 集合对象:" + users);
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值