IoC是一种通过描述来生成或获取对象的技术(更准确说是理念),在Spring中,我们可以通过注解的方式描述对象。Spring吧每一个需要管理的对象称之为Spring Bean,管理这些Spring Bean的容器称之为IoC容器,一个IoC容器需要具备两个基本的功能:
- 通过描述管理Bean,包括发布和获取Bean;
- 通过描述完成Bean之间的依赖关系。
Spring中要求所有的IoC容器都需要实现接口BeanFactory,其源码如下:
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 = "&";
Object getBean(String name) throws BeansException;
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);
<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);
boolean containsBean(String name);
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
String[] getAliases(String name);
}
默认情况下,Bean都是单例的,因此注意到上述代码中有两个方法:isSingleton(String)和isPrototype(String name),对于同一个Bean来说,这两个方法的返回值是相反的,如果一个Bean是Singleton的,那么每次IoC容器都会返回给调用者同一个Bean,如果一个Bean是Prototype,那么每次Ioc容器会创建一个新的Bean返回给调用者。TIPS:Spring只能管理单例Bean的生命周期。
未完