Spring系列bean的高级配置

Spring系列bean的高级配置,第1张

查看下面两个Employee的配置,其中dept属性是重复的。

Spring允许继承bean的配置,被继承的bean称为父bean。继承这个父bean的bean 称为子bean

子bean从父bean中继承配置,包括bean的属性配置

子bean也可以覆盖从父bean继承过来的配置

父bean可以作为配置模板,也可以作为bean实例。若只想把父bean作为模板,可以设置 的abstract 属性为true,这样Spring将不会实例化这个bean

如果一个bean的class属性没有指定,则必须是抽象bean

并不是 元素里的所有属性都会被继承。比如:autowire,abstract等。

也可以忽略父bean的class属性,让子bean指定自己的类,而共享相同的属性配置。 但 此时abstract必须设为true。

有的时候创建一个bean的时候需要保证另外一个bean也被创建,这时我们称前面的bean对后面的bean有依赖。例如:要求创建Employee对象的时候必须创建Department。 这里需要注意的是依赖关系不等于引用关系,Employee即使依赖Department也可以不引用它。

Java 的抽象类是什么

java 枚举的定义与用法

javaweb内容jsjava中json的使用

java技术事务的传播行为

Java 数据结构都有哪些

这个过程会记录下所有的bean定义,这只是定义,还没生成具体的bean。

Map<String, RootBeanDefinition>mergedBeanDefinitions。

为了不至于每次用到配置信息的时候都去解析一遍配置文件,我们需要将解析结果保存起来。而保存解析结果这个过程就是BeanDefinition的注册。

顺着obtainFreshBeanFactory方法,进入到AbstractRefreshableApplicationContext的refreshBeanFactory方法,这个方法的主要功能就是创建默认的IOC容器和Xml配置文件的相关 *** 作。

执行完,bean定义信息就加载完成了,后面就根据这些定义信息生成bean。

容器启动时,先读取配置文件,如果发现配置文件里设置了扫描注解,则扫描注解生成每个bean的BeanDefinition放入BeanDefinition 容器。再继续读取xml,将配置的bean放入到BeanDefinition 容器中,这样bean定义容器就有了所有的BeanDefinition。

下一步就根据这些bean定义生成bean对象,并注入依赖的bean,如果依赖的bean没有,则继续生成,这样递归下去,知道所有的bean都生成结束。

构造一个IOC容器需要如下几个步骤:

第一步:资源的定位。所谓资源就是指Spring里众多的XML配置文件,要获取到配置文件里面的信息,首先是要找到它。

第二步:加载和解析资源文件。XML文件里面定义的一些节点,和Spring里面定义的数据结构不匹配,那么就需要按照Spring的解析规则将XML解析成Spring需要的。

第三步:将解析完的数据结构注册到IOC容器中。Spring中内部的数据结构叫BeanDefinition。

经过以上三个步骤之后,IOC容器已经构造好,但是还是不能被直接使用。BeanDefinition只是配置文件里的配置在IOC中建立的一个映射,对于IOC容器来说最重要的依赖关系都还没有注入呢,相当于光有一个壳,内容还没有填充。

这里又有个Spring中重要的概念,叫做依赖注入。依赖的意思上文中有提到过吧,就是对象的引用关系嘛,注入是个动词,个人理解为设置,那依赖注入的意思不就是设置对象的引用关系了哇。

接下来这个过程是容器的实例化。容器的实例化只有一步,就是依赖注入。

完成IOC容器的构造和实例化之后,完整的IOC就建立好了。主线分析好了,接下来便可以顺藤摸瓜的学习源码了。

依赖注入主要有两个过程,一个是实例化Bean,另一个是将依赖关系注入到Bean中。

依赖注入的入口是我们熟悉的getBean方法。

BeanFactory允许InputStream作为构造函数的参数,也可以org.springframework.core.io.Resource接口。下面这个例子是用ClassPathResource作为参数:

Resource resource = new ClassPathResource("bean.xml")

BeanFactory factory = new XmlBeanFactory(resource)

ActionBean action = (ActionBean) factory.getBean("actionBean")

如果同一个Bean在配置文件有多个bean的定义,则用下面的方法取得所有的对象:

Resource resource = new ClassPathResource("bean.xml")

ListableBeanFactory factory = new XmlBeanFactory(resource)

Map helloBeans = factory.getBeansOfType(ActionBean.class, false, false)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11585739.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存