1,实例化bean
就Spring IoC容器而言,bean定义基本上描述了创建一个或多个实际bean对象的内容。当需要的时候,容器会从bean定义列表中取得一个指定的bean定义,并根据bean定义里面的配置元数据使用反射机制来创建一个实际的对象。因此这一节将讲解如何告知Spring IoC容器我们将要实例化的对象的类型以及如何实例化对象。
当采用XML描述配置元数据时,将通过<bean/>元素的class属性来指定实例化对象的类型。class 属性 (对应BeanDefinition实例的Class属性)通常是必须的(不过也有两种例外的情形,“使用实例工厂方法实例化”和“bean定义的继承”)。class属性主要有两种用途:在大多数情况下,容器将直接通过反射调用指定类的构造器来创建bean(这有点等类似于在Java代码中使用new操作符);在极少数情况下,容器将调用类的静态工厂方法来创建bean实例,class属性将用来指定实际具有静态工厂方法的类(至于调用静态工厂方法创建的对象类型是当前class还是其他的class则无关紧要)。
2, 延迟初始化bean
ApplicationContext实现的默认行为就是在启动时将所有singleton bean提前进行实例化。提前实例化意味着作为初始化过程的一部分,ApplicationContext实例会创建并配置所有的singleton bean。通常情况下这是件好事,因为这样在配置中的任何错误就会即刻被发现(否则的话可能要花几个小时甚至几天)。
有时候这种默认处理可能并不是你想要的。如果你不想让一个singleton bean在ApplicationContext实现在初始化时被提前实例化,那么可以将bean设置为延迟实例化。一个延迟初始化bean将告诉IoC 容器是在启动时还是在第一次被用到时实例化。
在XML配置文件中,延迟初始化将通过<bean/>元素中的lazy-init属性来进行控制。例如:
<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true">
<!-- various properties here... -->
</bean>
<bean name="not.lazy" class="com.foo.AnotherBean">
<!-- various properties here... -->
</bean>
当ApplicationContext实现加载上述配置时,设置为lazy的bean将不会在ApplicationContext启动时提前被实例化,而not.lazy却会被提前实例化。
需要说明的是,如果一个bean被设置为延迟初始化,而另一个非延迟初始化的singleton bean依赖于它,那么当ApplicationContext提前实例化singleton bean时,它必须也确保所有上述singleton 依赖bean也被预先初始化,当然也包括设置为延迟实例化的bean。因此,如果Ioc容器在启动的时候创建了那些设置为延迟实例化的bean的实例,你也不要觉得奇怪,因为那些延迟初始化的bean可能在配置的某个地方被注入到了一个非延迟初始化singleton bean里面。
在容器层次中通过在<beans/>元素上使用'default-lazy-init'属性来控制延迟初始化也是可能的。如下面的配置:
<beans default-lazy-init="true">
<!-- no beans will be eagerly pre-instantiated... -->
</beans>
3,自动装配(autowire)协作者
Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系。因此,如果可能的话,可以自动让Spring通过检查BeanFactory中的内容,来替我们指定bean的协作者(其他被依赖的bean)。由于autowire可以针对单个bean进行设置,因此可以让有些bean使用autowire,有些bean不采用。autowire的方便之处在减少或者消除属性或构造器参数的设置,这样可以给我们的配置文件减减肥![2] 在xml配置文件中,autowire一共有五种类型,可以在<bean/>元素中使用autowire属性指定:
Table 3.2. Autowiring modes
模式 说明
no 不使用自动装配。必须通过ref元素指定依赖,这是默认设置。由于显式指定协作者可以使配置更灵活、更清晰,因此对于较大的部署配置,推荐采用该设置。而且在某种程度上,它也是系统架构的一种文档形式。
byName 根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。例如,在bean定义中将autowire设置为by name,而该bean包含master属性(同时提供setMaster(..)方法),Spring就会查找名为master的bean定义,并用它来装配给master属性。
byType 如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置dependency-check="objects"让Spring抛出异常。
constructor 与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。
autodetect 通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。
如果直接使用property和constructor-arg注入依赖的话,那么将总是覆盖自动装配。而且目前也不支持简单类型的自动装配,这里所说的简单类型包括基本类型、String、Class以及简单类型的数组(这一点已经被设计,将考虑作为一个功能提供)。自动装配还可以与依赖检查结合使用,这样依赖检查将在自动装配完成之后被执行。
理解自动装配的优缺点是很重要的。其中优点包括:
自动装配能显著减少配置的数量。不过,采用bean模板(见这里)也可以达到同样的目的。
自动装配可以使配置与java代码同步更新。例如,如果你需要给一个java类增加一个依赖,那么该依赖将被自动实现而不需要修改配置。因此强烈推荐在开发过程中采用自动装配,而在系统趋于稳定的时候改为显式装配的方式。
自动装配的一些缺点:
尽管自动装配比显式装配更神奇,但是,正如上面所提到的,Spring会尽量避免在装配不明确的时候进行猜测,因为装配不明确可能出现难以预料的结果,而且Spring所管理的对象之间的关联关系也不再能清晰的进行文档化。
对于那些根据Spring配置文件生成文档的工具来说,自动装配将会使这些工具没法生成依赖信息。
如果采用by type方式自动装配,那么容器中类型与自动装配bean的属性或者构造函数参数类型一致的bean只能有一个,如果配置可能存在多个这样的bean,那么就要考虑采用显式装配了。
尽管使用autowire没有对错之分,但是能在一个项目中保持一定程度的一致性是最好的做法。例如,通常情况下如果没有使用自动装配,那么仅自动装配一个或两个bean定义可能会引起开发者的混淆。
分享到:
相关推荐
在准备整合Spring之前,也在网上看了...不然这些肯定是java方面的常识而已。楼主还是一步一步的来吧,感觉Spring操作Hibernate还是离不开DataSource,SessionFactory,Transaction这几个要素。 详细说明看我的博客文章。
1. **Spring Boot**: Spring Boot简化了Java应用的初始搭建以及开发过程。它内嵌了Tomcat服务器,集成了大量的Spring生态系统中的组件,并提供了自动配置功能。在本项目中,Spring Boot作为基础框架,使得微服务的...
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[架构必备] Spring cloud 微服务核心组件集 mica v1.1.1 发布相关的知识,希望对你有一定的参考价值。 mica(云母) mica 云母,寓意为云服务的核心...
根据常识,春天通常从三月开始,因此正确答案是A. March。这也涉及地理学和自然知识,理解不同季节与月份的关系。 4. 季节特征描述:Spring is _________. 春天是______。春天的气候特点是温暖的,所以A. warm 是...
1. 常识目标:学生能够掌握四个技能词汇:sent, fine, chocolate, season。 2. 能力目标:训练学生谈论自己最喜欢季节的能力,提高他们的口语表达能力。 3. 情感目标:让学生了解电话礼仪,认识不同季节的特点。 ...
此压缩包中包含平时开发涉及的API帮助文档,比如:JDK_API_1_6_zh_CN 、spring2[1].0中文开发参考手册、struts2中文教程、Hibernate中文API、JScript API、jQuery 1.4中文手册、网页设计配色常识、CSS样式表等等
本套课程由CSDN学院与咕泡学院共同打造,主要会围绕Spring Boot初遇、基本常识、注解和源码分析以及进阶4个方面进行讲解。 即使你之前从来没有用过Spring Boot也没关系,课程会带领你从0到进阶一步步提升,让你对...
系统主要包括首页,个人中心,用户管理,保健品分类管理,药品分类管理,药品信息管理,疫情常识管理,保健品管理,系统管理,订单管理等功能模块。但是,这套系统实现的功能只是整个逍遥大药房管理系统中的一部分,...
以管理员登录系统,通过首页,个人中心,用户管理,保健品分类管理,药品分类管理,药品信息管理,疫情常识管理,保健品管理,系统管理,订单管理等功能模板,可以有效的分配各用户的权限。逍遥大药房管理系统在逍遥...
1.能够与互联网进行交互 2.能够实现网页登录注册及验证 3.实现对青少年网络信息安全常识性问题的科普 4.按照科普中国网站进行仿制(具体功能、页面效果跟那个网站差不多就行),使CSS、JS、jQuery等对网页进行美化...
以管理员登录系统,通过首页,个人中心,用户管理,保健品分类管理,药品分类管理,药品信息管理,疫情常识管理,保健品管理,系统管理,订单管理等功能模板,可以有效的分配各用户的权限。逍遥大药房管理系统在逍遥...
本选题则旨在通过标签分类管理等方式,实现管理员:首页、个人中心、用户管理、早教知识管理、待产经验分享管理、怀孕常识管理、月子食谱管理、好物推荐管理、好物类型管理、圈子交流、系统管理,用户;首页、个人...
- JavaWeb是指基于Java技术的Web应用程序开发,它结合了Java的各种技术框架,如Servlet、JSP、Spring等,以及前端技术如HTML、CSS、JavaScript等。 - JavaWeb开发的优点在于其强大的跨平台能力、丰富的开源库支持...
在本文中,我们将深入探讨如何将Spring Boot与Apache Kafka整合,构建一个高效的消息队列系统。Apache Kafka是一个分布式流处理平台,它允许我们处理和存储大量实时数据。Spring Boot简化了Java应用程序的开发,尤其...
车辆充电桩管理系统,用户进入到系统首页,可以查看首页、充电桩、充电常识、个人中心、后台管理等内容进行操作 1.2 后台用户管理 用户登录进入车辆充电桩管理系统可以对首页、个人中心、充电桩报修管理、维修回复...
在Java编程中,这种模式常用于构建灵活、可扩展的处理流程,比如在Spring Boot、Spring Cloud等框架中。 在给定的文件列表中,我们可以看到以下几个类: 1. Client.java:这是客户端代码,通常会初始化处理链并发起...
4. Spring Boot:结合Spring框架,简化了创建RESTful服务的过程。 六、现代Web服务——API Gateway与微服务 随着微服务架构的发展,API Gateway成为现代Web服务的重要组成部分。API Gateway作为系统的入口,负责...