Spring--装配Bean

来源:互联网 发布:rmvb转mp4 mac 编辑:程序博客网 时间:2024/06/14 18:39
Spring容器负责创建应用程序中的Bean并通过DI来协调这些对象之间的关系。当描述bean如何进行装配时,Spring具有非常大的灵活性,它提供了三种主要的装配机制:    1.在XML中进行显式配置;    2.在Java中进行显式配置;    3.隐式的bean发现机制和自动装配。

自动化装配bean
Spring从两个角度来实现自动化装配:
1.组件扫描:Spring会自动发现应用上下文中所创建的bean。
2.自动装配:Spring自动满足bean之间的依赖。
为了阐述组件扫描和自动装配,我们需要创建几个bean。
## 组件扫描 ##

package DIsystem;public interface CompactDisc {    void play();}
实现CompactDisc接口的类,其SgtPeppers类上使用了@Component注解。这个简单的注解会告知该类会作为组件类,并告知Spring会为此类创建Bean。
package DIsystem;import org.springframework.stereotype.Component;@Componentpublic class SgtPeppers implements CompactDisc {    private String playing = "Bang";    private String artist = "bigbang";    @Override    public void play() {        System.out.println("Playing:" + playing + " by " + artist);    }}
不过,组件扫描默认是不启动的。我们还需显式配置一下Spring,从而让它去寻找带有@Component注解的类,并为其创建bean。
package DIsystem;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;@Configuration@ComponentScanpublic class DIPlayerConfig {    /*定义了Spring的装配规则*/}
@ComponentScan默认会扫描与配置类相同的包,查找带有@Component注解的类。这样的话就发现CompactDisc 。并且会在Spring中自动创建一个Bean。## 通过为Bean添加注解实现自动装配 ##自动装配就是让Spring自动满足bean依赖的一种方法,在满足依赖的过程中,会在Spring上下文中寻找匹配某个bean需求的其他bean。为了声明要进行自动装配,我们可以借助Spring的@Autowired注解。
package DIsystem;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;@Componentpublic class DIPlayer implements MediaPlayer{    private CompactDisc di;    @Autowired    public DIPlayer(CompactDisc di) {        this.di = di;    }    public void play() {        di.play();    }}
@Autowired注解不仅能够用在构造器上,还能用在类的任何方法上。如果没有匹配的bean,那么在应用上下文创建的时候,Spring会抛出一个异常。为了避免异常的出现,可以将@Autowired的required属性设置为false,将required属性设置为false时,Spring会尝试执行自动装配,但是如果没有匹配的bean的话,Spring将会处于未装配的状态。
    @Autowired(required=false)    public DIPlayer(CompactDisc di) {        this.di = di;    }

通过Java代码装配bean

如果你想将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上添加@Component和@Autowired注解的,因此就不能使用自动化装配的方案了,这时,你就必须采用显式装配的方式。在进行显式配置的时候,有两种可选方案:Java和XML。## 用JavaConfig进行装配 ##
package DIsystem;import org.springframework.context.annotation.Configuration;@Configurationpublic class DIPlayerConfig {}
创建JavaConfig类的关键在于为其添加@Configuration注解,@Configuration表明这个类是一个配置类,该类应该包含在Spring应用上下文中如何创建Bean的细节。
package DIsystem;@Beanpublic CompactDisc SgtPeppers {    return new SgtPeppers();}
@Bean注解会告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文中的Bean。方法体中包含了最终产生bean实例的逻辑。默认情况下,bean的ID与带有@Bean注解的方法名一样的。如果想设置成一个不同名字的话,可以通过name属性指定一个不同的名字。

通过XML装配bean

在使用JavaConfig的时候,这意味着要创建一个带有@Configuration注解的类,而在XML配置中,这意味着要创建一个XML文件,并且要以<beans>元素为根。<bean>元素类似于JavaConfig中的@Bean注解。我们可以按照如下方式声明CompactDisc bean:
<bean class="DIsystem.SgtPeppers" />
因为没有明确给定ID,所以这个bean将会根据全限定类名来进行命名。也可以设置属性id。

在XMl中声明DI时,会有多种可选的配置方案和风格。具体到构造器注入,有两种基本的配置方案可供选择:
1.元素。
2.使用Spring3.0引入的c-命名空间。
两者的区别在很大程度上就是是否冗长烦琐。

原创粉丝点击