Spring入门(Bean自动装配)

来源:互联网 发布:zabbix的端口号是多少 编辑:程序博客网 时间:2024/06/04 19:35

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并没有严格的关系。

原创粉丝点击