Spring中自动装配的三种方式

Sprring中Bean的自动装配有3种方法:一、byName 二、byType 三、Constructor

第一步:配置我们的spring-autowriting.xml,我们先使用第一种方法ByName

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://www.springframework.org/schema/beans"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
    default-autowire="byName">
    <bean id="autoWritingService" class="com.imooc.autowriting.AutoWritingService"></bean>
    <bean id="autoWritingDAO" class="com.imooc.autowriting.AutoWritingDAO"></bean>
</beans>

第二步:创建3个类,一个测试类TestAutoWriting,一个是引用类AutoWritingService,一个是被引用类AutoWritingDAO

测试类,不必多说,引入xml后通过getbean获得引用类的实例

package com.imooc.test.autowriting;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.imooc.autowriting.AutoWritingService;

public class TestAutoWriting {
 public static void main(String[] args) {
  ApplicationContext ctx=new ClassPathXmlApplicationContext("spring-autowriting.xml");
  AutoWritingService service=ctx.getBean("autoWritingService", AutoWritingService.class);
  service.say("this is a test");
 }

}

引用类 当采用ByName方式时,需要对被引用类的实例进行set封装

package com.imooc.autowriting;

public class AutoWritingService {
 private AutoWritingDAO autoWritingDAO;

 public void setAutoWritingDAO(AutoWritingDAO autoWritingDAO) {
  this.autoWritingDAO = autoWritingDAO;
 }
 
 public void say(String word)
 {
  this.autoWritingDAO.say(word);
 }
}

被引用类

package com.imooc.autowriting;

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

}

第三步: 进行测试

byName的方法的原理有一点值得说一下:setAutoWritingDAO这个方法的执行是因为我们在xml中配置了default-autowire="byName",当进入被引用类时,setAutoWritingDAO方法被执行,通过在xml中寻找name为autoWritingDAO的Bean,如果没找到就不执行。

第二种方法ByType的原理其实与byName差不多,只不过这一次它的寻找条件变成了class类,可以理解在执行setAutoWritingDAO时,对比class类和我们穿进去的参数是不是一个类型,

如果是就执行,不是就不执行,值得注意的是:这里填不填Name都无所谓。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://www.springframework.org/schema/beans"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
    default-autowire="byType">
    <bean id="autoWritingService" class="com.imooc.autowriting.AutoWritingService"></bean>
    <bean  class="com.imooc.autowriting.AutoWritingDAO"></bean>
</beans>

更改一下xml即可测试成功

第三种方法Constructor,当使用这种方法时,被引用类的写法要改变,不需要再写set方法,而是要写类的构造函数

package com.imooc.autowriting;

public class AutoWritingService {
 private AutoWritingDAO autoWritingDAO22;

   public AutoWritingService(AutoWritingDAO autoWritingDAO)
   {
    this.autoWritingDAO22=autoWritingDAO;
   }
 
 public void say(String word)
 {
  this.autoWritingDAO22.say(word);
 }
}

改变xml中的方法后即可测试成功

 我们说了这么多,那么我们上面做的这些究竟是为了什么?

答案是通过依赖注入来实现松耦合。

首先给大家抛出耦合的概念。什么是耦合?

不用Spring的情况下,

package com.imooc.autowriting;

public class AutoWritingService {
 private AutoWritingDAO autoWritingDAO22;

   public AutoWritingService(AutoWritingDAO autoWritingDAO)
   {
    this.autoWritingDAO22=autoWritingDAO;
   }
 
 public void say(String word)
 {
  this.autoWritingDAO22.say(word);
 }
}

假设说AutoWritingDAO是一个接口,这么写肯定不行,我们必须有它的实现类。  public AutoWritingService(AutoWritingDAOiml autoWritingDAO)

但这么写有一个致命的缺点就是紧耦合。

在AutoWritingService这个类我们创建了autoWritingDAO的实例,让这2个类紧紧地联系在了一起,这就是紧耦合。耦合当然是必须的,但是紧耦合会带来很多坏处。使用Spring的依赖注入,可以让我们使用任何一个AutoWritingService接口的实现类。这样我们就可以在不懂源码的情况下偷偷更换接口的实现。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值