Spring--装配Bean

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;

@Component
public 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
@ComponentScan
public 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;

@Component
public 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;

@Configuration
public class DIPlayerConfig {
}
创建JavaConfig类的关键在于为其添加@Configuration注解,@Configuration表明这个类是一个配置类,该类应该包含在Spring应用上下文中如何创建Bean的细节。
package DIsystem;

@Bean
public 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-命名空间。
两者的区别在很大程度上就是是否冗长烦琐。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值