Core Spring二装配beans
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Core Spring二装配beans相关的知识,希望对你有一定的参考价值。
在Spring中,对象不负责寻找和创建它们需要的其他对象。创建两个应用对象之间关联的动作是依赖注入的核心功能,通常称为装配。
创建beans和构建它们之间的关系是Spring的责任,但是告诉Spring哪些bean需要被创建并且怎样将它们装装配到一起是开发者的责任。Spring提供了三种基本的装配机制。
-
-
- 显式地通过XML配置
- 显式地通过Java配置
- 隐式地发现bean并且自动装配
-
自动装配beans
Spring从两个角度解决自动装配
-
-
- Component scanning----Spring自动发现beans并在容器中创建
- Autowiring-----Spring自动构建bean的依赖
-
组件扫描
组件扫描不是默认开启项,需要显式配置以便Spring寻找带有@Component注解的类并创建它们。@Component注解可以在它的属性中标注bean的ID。例如,@Component("id"),如果没有显式标注ID,那么Spring会将这个bean的ID设为类名并将首字母小写。基于Java配置如下:
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan public class CDPlayerConfig { }
除此之外,可以用Java Dependency Injection specification(JSR-330)中的注解@Named为bean提供ID。Spring支持将@Named替换@Component。
如果没有更多配置@ComponentScan将会默认扫描与配置类所在包相同的类。但是,应该显式地设置扫描的base package,因为那样你可以将所有的配置代码归置到一个包中,区别于应用代码。例如这样@ComponentScan("basepackagename")、或者@ComponentScan(basePackages="soundsystem"),多个包的情况,@ComponentScan(basePackages={"soundsystem", "video"})。用上述String形式配置base package时,并不是类型安全的,如果重构包名,指定的base package将会出错,因此@ComponentScan可以通过base package中的类或者接口定义base package,如:@ComponentScan(basePackageClasses={CDPlayer.class, DVDPlayer.class})
基于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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="soundsystem" /> </beans>
自动装配
如果应用程序中所有的对象都是独立的,没有依赖的,那么组建扫描就能完成所需功能。但是如果对象包含对其他对象的依赖,那么自动装配就能派上用场了。
@Autowired注解可以用在构造函数、属性的setter方法甚至任何方法上。无论构造函数、setter方法或其他任何方法,Spring将会尝试构建参数的依赖。仅当有且仅有一个bean匹配,才会将这个bean装配。如果没有bean匹配,Spring会在容器创建时抛出一个异常。为了避免这个异常你可以设置@Autowired的required属性为false,@Autowired(required=false)。当required属性为false时,Spring将会进行自动装配,但是如果没有bean匹配,会使需要注入依赖关系的bean未装配。你应该十分谨慎地设置required属性为false。bean的属性未被装配,有可能发生空指针异常。如果有多个bean匹配,Spring将会抛出异常表示出现歧义现象。
同样的,可以用Java Dependency Injection specification中的注解@Inject代替@Autowired。
通过Java装配bean
尽管通过自动装配的方式构造依赖很方便,但是有时我们必须显式地配置Spring。比如,需要从第三方类库中装配一些组件进入你自己的应用。因为你无法获取源码,所以没有机会在类上标记@Component和@Autowired注解。
Java方式配置优于XML方式的配置,它更强大,类型安全,方便重构。
创建一个JavaConfig类的关键在于用@Configuration注解标记它。通过编写一个创建需要类型实例的方法并且用@Bean标记它的方式在JavaConfig中声明一个bean。
@Bean public CompactDisc sgtPeppers() { return new SgtPeppers(); }
默认地,bean的ID会被设置为同@Bean注解标识的方法名称一样。也可以指定ID,@Bean(name="lonelyHeartsClubBand")。
以上是关于Core Spring二装配beans的主要内容,如果未能解决你的问题,请参考以下文章