首页 / 技术 / 正文

Spring 的自动装配

2016年01月05日 暂无评论 ... 技术

使用 Spring 的自动装配功能,可以减少对大量 Bean 的手动配置和编写,同时可以结合使用注释的方法自动装配,可以节省大量 xml 代码。

Spring 的自动装配是根据类型或者名称自动装配的,分为普通自动装配和注解自动装配。

普通自动装配

即在 xml 文件中做自动装配,节省大量 Bean 的配置。

自动装配有4种形式

byName、byType、constructor、autodetect

byName 自动装配

根据名称自动装配,为属性自动装配 ID 与该属性的名字形同的 Bean。

假如属性的名字恰好与要被装配到该属性的 Bean 的名字匹配,则 Spring 可以将这个 Bean 自动装配到该属性中。

假设没有使用自动装配的 bean 配置文件如下,我首先配置了一个名为 user 的 Bean,然后在配置 manager 的 Bean 中引用了 user 这个 Bean 作为 manager 中的一个属性。

  1. <!-- 事先定义了user的bean --> 
  2. <bean id="user" class="com.yelook.spring.User"></bean> 
  3. <!-- manager 的bean中需要装配m1和user两个属性 --> 
  4. <bean id="manager" class="com.yelook.spring.Manager"> 
  5.     <property name="m1" value="10"></property> 
  6.     <property name="user" ref="user"></property> 
  7. </bean> 

然后使用自动装配来修改上述代码

  1. <!-- 事先定义了user的bean --> 
  2. <bean id="user" class="com.yelook.spring.User"></bean> 
  3. <!-- manager 的bean中需要装配m1和user两个属性 --> 
  4. <bean id="manager" class="com.yelook.spring.Manager" autowire="byName"> 
  5.     <property name="m1" value="10"></property> 
  6. </bean> 

少了一行,看起来比较少,因为只是案例,如果需要装配的属性比较多,就看得出效果来了。

跟之前代码不相同的是,property 标签中增加了 autowire="byName" 的属性。

byType 自动装配

根据类型自动装配,Spring 会寻找哪一个 Bean 的类型与属性的类型相配,则会被自动装配。用法与 byName 类似。

constructor 自动装配

通过构造器注入配置的 Bean 则使用 constructor 自动装配。

autodetect 自动装配

如果设置为 autodetect 装配的话,Spring 会首先尝试构造器自动装配,如果没有合适的 Bean 时,则会尝试使用 byType 方式装配,这种方式成为最佳装配。

基于注解的自从装配

如果需要使用注解的方式自动装配,需要首先在 Spring 配置文件中首先开启 context 的命名空间,并且加入代码:

<context:annotation-config></context:annotation-config>

使用 @Autowired 注解

@Autowired 放置在实现类中,可以放在属性、方法和构造器之上,Spring 搜索到有 @Autowired 注解时会自动为其注册为 Bean,默认属性方法构造器的名称是什么,Bean 就被命名为什么。

不过你可以自己设置注解 Bean 的名称,使用 @Qualifier 注解,此注解放置在 @Autowired 之后,如:

@Qualifier("mybean")

则将其 Bean 命名为 mybean。

自动装配的缺陷

自动装配虽然很方便,但是缺陷也是有的。

比如可以造成同一个 Bean 被多个其他 Bean 引用,但是这可能不是真正的目的;

@Autowired 注解规定,必须有 Bean 装配了其所标注的属性和参数中,否则会出现错误;

还有可能造成其他的混乱。

暂无评论

发布评论