Spring介绍(三)自动装载------no模式
首先我们要先了解Spring中的自动装载
Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系。因此,如果可能的话,可以自动让Spring通过检查BeanFactory
中的内容,来替我们指定bean的协作者(其他被依赖的bean)。autowire一共有六种类型。由于autowire可以针对单个bean进行设置,因此可以让有些bean使用autowire,有些bean不采用。autowire的方便之处在减少或者消除属性或构造器参数的设置,这样可以给我们的配置文件减减肥![2] 在xml配置文件中,可以在<bean/>
元素中使用autowire属性指定:
模式
|
说明
|
default
|
缺省的 它根据根标签的装载模式来装载
|
no
|
不自动装载
|
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以及简单类型的数组(这一点已经被设计,将考虑作为一个功能提供)。byType和constructor自动装配模式也可用于数组和指定类型的集合。在这种情况下容器中的所有匹配的自动装配对象将被用于满足各种依赖。对于key值类型为 String的强类型Map也可以被自动装配。一个自动装配的Map的value值将由所匹配类型的bean所填充。而Map的key值则是相应的bean的名字。
自动装配还可以与依赖检查结合使用,这样依赖检查将在自动装配完成之后被执行。
理解自动装配的优缺点是很重要的。其中优点包括:
- 自动装配能显著减少配置的数量。不过,采用bean模板也可以达到同样的目的。
- 自动装配可以使配置与java代码同步更新。例如,如果你需要给一个java类增加一个依赖,那么该依赖将被自动实现而不需要修改配置。因此强烈推荐在开发过程中采用自动装配,而在系统趋于稳定的时候改为显式装配的方式。
自动装配的一些缺点:
- 尽管自动装配比显式装配更神奇,但是,正如上面所提到的,Spring会尽量避免在装配不明确的时候进行猜测,因为装配不明确可能出现难以预料的结果,而且Spring所管理的对象之间的关联关系也不再能清晰的进行文档化。
- 对于那些根据Spring配置文件生成文档的工具来说,自动装配将会使这些工具没法生成依赖信息。
另一个问题需要注意的是,当根据类型进行自动装配的时候,容器中可能存在多个bean定义跟自动装配的setter方法和构造器参数类型匹配。虽然对于数组、集合以及Map,不存在这个问题,但是对于单值依赖来说,就会存在模棱两可的问题。如果bean定义不唯一,装配时就会抛出异常,面对这种场景我们有几个方案进行选择:第一个方案就是弃自动装配而改用显式装配;第二个方案就是在bean定义中通过设置'autowire-candidate'属性为'false'来将该bean排除在自动装配候选名单之外(详情见接下来的章节);第三个方案是通过在bean定义中设置'primary'属性为'true'来将该bean设置为首选自动装配bean。最后,对于使用Java 5的用户来说,可能会使用注解的形式来配置bean。
但决定是否使用自动装配式时,没有绝对的对错。考虑项目的实际是最好的办法。比如项目通常不使用自动装配,那么使用它来仅仅装配2个bean定义是很让人困惑的。
下面我们来举例说明no模式:
首先我们来创建一个有一个String属性的类:
package cn.csdn.service;
public class AddressServiceImpl {
private String address;
public void setAddress(String address) {
this.address = address;
}
}
然后我们再创建一个Emp类,类中有一个AddressServiceImpl的对象。
package cn.csdn.service;
public class EmpServiceImpl {
private AddressServiceImpl companyAddress;
public EmpServiceImpl(AddressServiceImpl companyAddress){
this.companyAddress=companyAddress;
}
}
在创建一个测试的类:
package cn.csdn.service;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class app {
@Test
public void test(){
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:app*.xml");
EmpServiceImpl emp = (EmpServiceImpl) ac.getBean("empServiceImpl");
}
}
Xml中 的配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
default-autowire="no">
<!-- 配置bean -->
<bean id="addressServiceImpl" class="cn.csdn.service.AddressServiceImpl" scope="singleton">
<property name="address">
<value>北京上海</value>
</property>
</bean>
<bean id="empServiceImpl" class="cn.csdn.service.EmpServiceImpl" scope="singleton" autowire="no ">
<!—因为我们这的自动装载模式是no所以我们要这样写-->
<property name=”addressServiceImpl”>
<ref bean=” addressServiceImpl”/>
</property>
</bean>
</beans>
分享到:
相关推荐
标题中的“Spring 2.5.6介绍(九)——spring中没介绍的东西”暗示了这篇博客可能探讨的是Spring框架2.5.6版本中一些不常见或未被广泛讨论的功能。Spring是一个广泛使用的Java企业级应用开发框架,它以其依赖注入(DI...
1. **依赖注入增强**:在2.5.6版本中,Spring进一步优化了依赖注入机制,使得对象的创建和管理更加自动化。开发者可以通过XML配置或注解方式定义对象及其依赖关系,降低了组件间的耦合度,提高了代码的可测试性。 2...
spring2.5.6官方jar包 spring2.5.6官方jar包 spring2.5.6官方jar包 spring2.5.6官方jar包 spring2.5.6官方jar包 spring2.5.6官方jar包 spring2.5.6官方jar包
以下将详细介绍Spring 2.5.6的主要功能和特点: 1. **依赖注入(Dependency Injection, DI)**:这是Spring的核心特性之一,允许开发者在运行时动态地将对象之间的依赖关系进行管理,而不是在代码中硬编码这些依赖...
开发者无需在代码中创建对象,而是声明对象的依赖,Spring会自动进行实例化和装配。 2. **面向切面编程(AOP)**:Spring的AOP模块支持声明式事务管理、日志记录、性能监控等多种跨切面关注点。AOP允许开发者定义“切...
在Spring 2.5.6版本中,引入了对注解的支持,使得开发者在编写代码时可以更加简洁,不再需要大量XML配置。这个入门示例项目旨在帮助初学者了解和掌握Spring 2.5.6版本中的注解使用和基于XML的IoC配置。 首先,让...
5. **自动扫描**:Spring 2.5.6 引入了组件扫描(Component Scanning),可以自动发现并注册带有特定注解的类,简化了配置工作。 6. **数据访问**:Spring 提供了对多种数据访问技术的支持,包括 JDBC、ORM 框架如 ...
Spring 2.5.6 是一个历史悠久的版本,它标志着Spring框架在2008年的一个重要里程碑。这个版本引入了许多关键特性和改进,对于理解Spring框架的核心原理和设计模式至关重要。在这里,我们将深入探讨Spring 2.5.6源...
### 三、Spring 2.5.6依赖包介绍 所提供的依赖包包含了以下内容: 1. **所有必要的jar文件**:这些jar文件包含了Spring框架的所有核心模块和其他扩展模块,如spring-core、spring-beans、spring-context、spring-...
标题“spring2.5.6示例 imagedb”指的是一个关于Spring框架2.5.6版本的应用实例,其中可能包含了一个名为“imagedb”的数据库管理或图像存储相关的项目。这个实例可能用来演示如何在Spring 2.5.6中配置、管理和操作...
一、Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0) 1. jar包引入 Spring 2.5.6:spring.jar、spring-webmvc.jar、commons-logging.jar、cglib-nodep-2.1_3.jar Hibernate 3.6.8:hibernate3.jar...
2. **AOP实现**:源码揭示了Spring如何实现切面,包括代理模式的使用,以及如何将切面织入到目标对象中。 3. **事件传播**:通过源码可以学习到Spring如何实现应用程序事件和监听器,以及如何在容器内广播自定义...
通过依赖注入,Spring可以自动为对象提供所需的依赖,无需手动创建和装配对象。这个版本的Spring还支持AOP(Aspect Oriented Programming,面向切面编程),允许开发者定义横切关注点,如日志、事务管理等,以提高...
本文主要介绍了如何搭建 Spring 2.5.6 开发环境,通过图文形式详细介绍了整个搭建过程,内容涵盖了 jar 包准备、建立 User Library、创建相关类和接口、编写配置文件等方面。 jar 包准备 在开始搭建 Spring 2.5.6 ...
Spring2.5.6 帮助文档 API
在本示例中,我们将深入探讨Spring框架2.5.6版本中的面向切面编程(AOP)概念。Spring AOP是Spring框架的核心组件之一,它允许开发者在不修改源代码的情况下,对程序进行横切关注点(如日志、事务管理、性能监控等)...
这里我们关注的是Spring框架的2.5.6版本,这个版本在当时具有一定的影响力,为开发者提供了许多关键特性和改进。 首先,`spring-bean-2.5.6.jar`包含了Spring的核心bean管理功能。在Spring 2.5.6中,Bean容器允许...
Spring AOP通过代理模式实现,可以在不修改原有代码的情况下,添加新的功能或行为。 **spring.jar包** `spring.jar`是Spring框架的主要库文件,包含了所有核心模块和必需的类。这个JAR文件包含了如IoC容器、AOP、...
本篇参考文档旨在详细介绍Spring 2.5.6版本中的新特性及改进,帮助开发者更好地理解和运用这一版本。 #### 二、Spring 2.5.6新特性与改进 ##### 2.1 Inversion of Control (IoC) 容器 在Spring 2.5.6版本中,IoC...