3.1 IoC容器简介

所有的IoC容器都需要实现接口BeanFactory,这是一个顶级的容器接口

BeanFactory接口源码:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.beans.factory;

import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;

public interface BeanFactory {
    
    
    //前缀
    String FACTORY_BEAN_PREFIX = "&";
    //多个getBean方法
    Object getBean(String var1) throws BeansException;

    <T> T getBean(String var1, Class<T> var2) throws BeansException;

    Object getBean(String var1, Object... var2) throws BeansException;

    <T> T getBean(Class<T> var1) throws BeansException;

    <T> T getBean(Class<T> var1, Object... var2) throws BeansException;

    <T> ObjectProvider<T> getBeanProvider(Class<T> var1);

    <T> ObjectProvider<T> getBeanProvider(ResolvableType var1);
    //是否包含Bean
    boolean containsBean(String var1);
    //是否是单例
    boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;
    //是否是原型
    boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;
    //是否类型匹配
    boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;
    //获取Bean的类型
    @Nullable
    Class<?> getType(String var1) throws NoSuchBeanDe//finitionException;

    @Nullable
    Class<?> getType(String var1, boolean var2) throws NoSuchBeanDefinitionException;
    //获取Bean的别名
    String[] getAliases(String var1);
}

多个getBean方法中有按类型获取Bean的,也有按名称获取Bean的,这就意味着在Spring IoC容器中,允许我们按类型或者名称获取Bean,这对理解后面讲到的依赖注入(Dependency Injection, DI)是十分重要的

isSingleton方法判断Bean是否在Spring IoC中为单例,默认情况下,Bean都是以单例存在的,也就是用getBean方法返回的都是同一个对象
与之相反的是isPrototype方法,如果它返回的是true,那么当我们使用getBean方法获取Bean时,Spring IoC容器就会创建一个新的Bean返回给调用者,这和Bean的作用域有关

Spring在BeanFactory的基础上,还设计了一个更为高级的接口ApplicationContext,它是BeanFactory的子接口之一,我们使用的大部分Spring IoC容器是ApplicationContext接口的实现类
在这里插入图片描述

ApplicationContext接口通过继承上级接口,进而继承BeanFactory接口,但是在其基础上,扩展了MessageSource、EnvironmentCapable、ApplicationEventPublisher和ResourcePatternResolver

定义配置文件:

@Configuration
public class AppConfig {
    
    
    @Bean(name = "user")
    public User initUser() {
    
    
        User user = new User();
        user.setId(1L);
        user.setUserName("user_name_1");
        user.setNote("note_1");
        return user;
    }
}

@Configuration代表这是一个Java配置文件,Spring的容器会根据它来生成IoC容器去装配Bean;@Bean代表将initUser方法返回的POJO装配到IoC容器中,而其属性name定义这个Bean的名称,如果没有配置它,则将方法名称“initUser”作为Bean的名称保存到Spring IoC容器中

使用AnnotationConfigApplicationContext构建自己的容器

public class IoCTest {
    
    
    private static Logger log = Logger.getLogger(String.valueOf(IoCTest.class));

    public static void main(String[] args) {
    
    
        ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
        User user = ctx.getBean(User.class);
        log.info(String.valueOf(user.getId()));
    }
}

将AppConfig传递给AnnotationConfigApplicationContext的构造方法,这样它就能读取配置了,然后将配置里面的Bean装配到IoC容器中,于是可以使用getBean方法获取对应的POJO

疑惑:

private static Logger log = Logger.getLogger(IoCTest.class);

今天在敲的时候必须转化成String后传入,或许是版本问题(猜测)

猜你喜欢

转载自blog.csdn.net/weixin_48954087/article/details/121371836
3.1