从spring官网下载最新的源码,安装gradle,使用idea打开,由于各种问题,项目还是在报错,但是可以点了。
本spring是基于jdk10,spring5.1基于源码与书籍记录的笔记,不是教科书,如有不对之处请指正
Resource resource = new ClassPathResource("BeanFactoryTest.xml");
//这一步是对路径存入resource对象进行保存,没有读取操作。同时还获取类加载器。
InputStream inputStream = resource.getInputStream();
//从最基本的实现,分析spring到底做了什么
public XmlBeanFactory(Resource resource) throws BeansException {
this(resource, null);
}
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
this.reader.loadBeanDefinitions(resource);
}
super(parentBeanFactory);的实现:
XmlBeanFactory继承DefaultListableBeanFactory
这个super就是指DefaultListableBeanFactory的实现
接口BeanFactory:定义了IOC容器的结构,并提供IOC容器应遵循的十三个最基本实现。
String FACTORY_BEAN_PREFIX = "&";//常量 bean的前缀
1:Object getBean(String name) throws BeansException;//熟悉的方法,通过名字获取对象
2:<T> T getBean(String name, Class<T> requiredType) throws BeansException;//返回指定类的bean,指定之后返回
的直接就是某个对象
3:Object getBean(String name, Object... args) throws BeansException;//并非是返回一个存在的,而是通过给
与的参数创建一个新的
4:<T> T getBean(Class<T> requiredType) throws BeansException;//通过class返回对象,可以传对象的超类
5:<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);//返回bean的提供者
6:boolean containsBean(String name);检查某个对象是否存在
接口ListableBeanFactory特点:批量返回Bean的名字
1:ListableBeanFactory的接口
2:boolean containsBeanDefinition(String beanName);//检查Bean工厂是否有指定的Bean,会忽略掉其他地方注册得的Bean
3:int getBeanDefinitionCount();//Bean的数量,同上,忽略其他地方注册的
4:String[] getBeanDefinitionNames();//返回工厂中所有定义的Bean的名称
5:String[] getBeanNamesForType(ResolvableType type);//返回指定类型的Bean的名称
6:String[] getBeanNamesForType(@Nullable Class<?> type);//同上一样,允许为空。猜测应该是给空就返回所有。
@param includeNonSingletons//是否只包含单例Bean
@param allowEagerInit//是否允许预加载对象,以获取对象属性。应该是必传true,否则会报错。之后会初始化
BeanFactory和他的引用
7:String[] getBeanNamesForType(@Nullable Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);
8:<T> Map<String, T> getBeansOfType(@Nullable Class<T> type) throws BeansException;
. . .
特点:提供了批量返回对象名字,用于查对象的种种操作
接口:HierarchicalBeanFactory:针对BeanFactory的分层,实现了两个接口
BeanFactory getParentBeanFactory();//获取对象的父类工厂
boolean containsLocalBean(String name);//查询改对象是否在工厂中
分层的好处:效率,以及结构会更加清晰
接口:SingletonBeanRegistry:单例模式的定义以及需要实现的规则
SingletonBeanRegistry接口
//在容器内注册一个单例类
void registerSingleton(String beanName, Object singletonObject);
//返回给定名称对应的单例类
Object getSingleton(String beanName);
//给定名称是否对应单例类
boolean containsSingleton(String beanName);
//返回容器内所有单例类的名字
String[] getSingletonNames();
//返回容器内注册的单例类数量
int getSingletonCount();
public InputStream getInputStream() throws IOException {
InputStream is;
if (this.clazz != null) {
is = this.clazz.getResourceAsStream(this.path);
}
else if (this.classLoader != null) {
is = this.classLoader.getResourceAsStream(this.path);
}
else {
is = ClassLoader.getSystemResourceAsStream(this.path);
}
if (is == null) {
throw new FileNotFoundException(getDescription() + " cannot be opened because it does not exist");
}
return is;
}