spring中最重要的就是IOC(控制反转),bean的创建再也不用手动new,而是交由spring来进行管理。
spring会创建一个容器来储存bean对象,容器中其实是一个又一个的map,用来存储和管理bean。键是bean的名字,值是bean对象。
通常有两种注册bean的方式,xml文件方式和注释方式。
<bean id="myMap" class="java.util.HashMap">
<constructor-arg>
<map>
<entry key="key1" value="value1"/>
<entry key="key2" value="value2"/>
<entry key="key3" value="value3"/>
</map>
</constructor-arg>
</bean>
或者
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class AppConfig {
@Bean
public Map<String, String> myMap() {
Map<String, String> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
return map;
}
}
spring把不同文件定义的bean转换成相同的BeanDefinition,所以设计了一个BeanDefinitionReader接口,只要实现loadBeanDefinitions方法就可以把定义的bean转化成BeanDefinition。
而注解是使用AnnotatedBeanDefinitionReader(不过并没有实现BeanDefinitionReader)使用
private <T> void doRegisterBean(Class<T> beanClass, @Nullable String name,
@Nullable Class<? extends Annotation>[] qualifiers, @Nullable Supplier<T> supplier,
@Nullable BeanDefinitionCustomizer[] customizers)
来进行解析的,最后也解析成BeanDefinition。
而解析出来的BeanDefinition并不完整,如果他的value使用${}取读取配置文件的信息。spring提供了一个BeanFactoryPostProcessor用于处理BeanDefinition。BeanFactory就像是IOC容器的门户,需要通过他来访问容器。最重要的实现类是ApplicationContext ,可以通过ApplicationContext 直接操作容器,比如通过getBean方法直接使用name获取指定的Bean。
有了完整的BeanDefinition就可以开始实例化了