Spring入门(Bean自动装配)

Autowiring自动装配
有哪些类型
No:不做任何操作(默认的)。
byname:根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动匹配。如果重复的话,IOC容器启动就会失败,不能存在两个相同的id。
byType:如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动匹配;如果存在多个该类型bean,那么抛出异常,并指出不能使用byType方式进行自动匹配;如果没有找到相匹配的bean,则什么事都不发生。
Constructor:与byType方式类似,不同之处在于它应用于构造器函数。如果容器中没有找到与构造器参数类型一致的bean,那么抛出异常。

例子
先创建AutoWiringDAO和AutoWiringService两个类,然后将他们配置到Spring的配置文件中。

<bean id="autoWiringService" class="com.imooc.autowiring.AutoWiringService" ></bean>
<bean id="autoWiringDAO" class="com.imooc.autowiring.AutoWiringDAO" ></bean>

通过在beans标签下设置default-autowire来自动装配
然后在AutoWiringDAO里边定义一个say方法

public class AutoWiringDAO {

    public void say(String word) {
        System.out.println("AutoWiringDAO : " + word);
    }
}

然后是Service中的操作
采用的设值注入的方式.
首先生成AutoWiringDAO的set方法,然后定义Service的say方法,在里边调用DAO的say方法。

public class AutoWiringService {

    private AutoWiringDAO autoWiringDAO;
    //构造方法
    public AutoWiringService(AutoWiringDAO autoWiringDAO) {
        System.out.println("AutoWiringService");
        this.autoWiringDAO = autoWiringDAO;
    }

    public void setAutoWiringDAO(AutoWiringDAO autoWiringDAO) {
        System.out.println("setAutoWiringDAO");
        this.autoWiringDAO = autoWiringDAO;
    }

    public void say(String word) {
        this.autoWiringDAO.say(word);
    }
}

按照之前的设值注入的配置方法,在xml文件里应该是

<bean id="autoWiringService" class="com.imooc.autowiring.AutoWiringService" >
    <property name="autoWiringDAO" ref="sutoWiringDAO"></property>
</bean>

但是有了根据name的自动配置后,也就是default-autowire=”byName”,不需要property标签。只需要定义好bean,然后在引用的bean(AutoWiringService)中声明set方法和它的属性,被引用的bean(AutoWiringDAO)中不需要做任何操作。

单元测试类

@RunWith(BlockJUnit4ClassRunner.class)
public class TestAutoWiring extends UnitTestBase {
    public TestAutoWiring() {
        super("classpath:spring-autowiring.xml");
    }

    @Test
    public void testSay() {
        AutoWiringService service = super.getBean("autoWiringService");
        service.say(" this is a test");
    }
}

这里service的say调用DAO的say,最终输出AutoWiringDAO:this is a test。
那么set这个方法是如何被执行的?
因为设置了default-autowire=”byName”,set为了将值赋给private的那个属性autoWiringDAO,在会在spring文件中寻找和autoWiringDAO完全一致的bean的id(对应的类AutoWiringDAO),将它的实例赋给那个属性(this.autoWiringDAO = autoWiringDAO(这个是实例))。

也就是说用这种默认的自动装配的方式可以减少我们在配置bean时的代码行数,使整个bean的配置看起来更简洁。

前边的是byName,如果是byType很类似,就是寻找对应的class,和bean的id没有直接的关系,甚至可以把id=”autoWiringDAO”删掉。

如果是default-autowire=”constructor”,在Service中写构造方法,之前已经写了

//构造方法
public AutoWiringService(AutoWiringDAO autoWiringDAO) {
    System.out.println("AutoWiringService");
    this.autoWiringDAO = autoWiringDAO;
}

根据构造器注入,是在IOC容器中查找构造器方法传入参数的类型在IOC容器中是否有相应类型的bean的实例,和id并没有严格的关系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值