所有的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后传入,或许是版本问题(猜测)