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);
}
}
但这么写有一个致命的缺点就是紧耦合。
在AutoWritingService这个类我们创建了autoWritingDAO的实例,让这2个类紧紧地联系在了一起,这就是紧耦合。耦合当然是必须的,但是紧耦合会带来很多坏处。使用Spring的依赖注入,可以让我们使用任何一个AutoWritingService接口的实现类。这样我们就可以在不懂源码的情况下偷偷更换接口的实现。