Java(Spring)学习笔记—>自动装配(autowire)

  • Post author:
  • Post category:java


这篇文章笔者和大家聊一聊自动装配,首先我们学习它的时候我们应该知道何为自动装配?

举个例子:一个人他有一只狗和一只猫,他有的 这两个动物就相当于这个人的名字一样,写在一个personn类中并且生成无参,有参,get和set对吧?在传统的创建这个人类的对象中,我们得先new一个人,再创建这两个动物;然而在Spring中,我们只需在XML文件中创建Person的对象,因为Person类中有了这两个动物,所以我们要得到这两个动物对象只需要自动装配上去,可以通过byName,也可以通过byType来实现自动装配,现在笔者将上述所对应的代码给大家,大家就能理解了自动装配。


Person类

package com.kaifamiao.ioc.relation;

import com.kaifamiao.ioc.Logable;

/**
 * @author 后来的老李
 * @version 1.0
 */
public class Person implements Logable {

    private Cat cat;
    private Dog dog;

    private String name;

    public Person() {
        super();
        logger.info("Person的无参构造");
    }

    public void have(){
        logger.info("have方法被执行");
        System.out.println("嗨,大家好!我是"+name+"我有一条狗叫"+dog.getName()+"和一只猫叫"+cat.getName());
    }
    public Cat getCat() {
        return cat;
    }

    public void setCat(Cat cat) {
        this.cat = cat;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


Dog类:

package com.kaifamiao.ioc.relation;

import com.kaifamiao.ioc.Logable;

/**
 * @author 后来的老李
 * @version 1.0
 */
public class Dog implements Logable {

    private String name;

    public Dog() {
        super();
        logger.info("Dog的构造");
    }

    public Dog(String name) {
        logger.info("Dog的有参构造");
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


Cat类:

package com.kaifamiao.ioc.relation;

import com.kaifamiao.ioc.Logable;

/**
 * @author 后来的老李
 * @version 1.0
 */
public class Cat implements Logable {

    private String name;

    public Cat() {
        super();
        logger.info("Cat的构造");
    }

    public Cat(String name) {
        logger.info("Cat的有参构造");
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


现在是XML文件,笔者希望大家将XML文件看懂,就能理解到自动装配了,注意autowire后的取值

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="dog" class="com.kaifamiao.ioc.relation.Dog"/>
    <bean id="cat" class="com.kaifamiao.ioc.relation.Cat"/>

    <!--byType实现自动装配-->
    <bean id="person" class="com.kaifamiao.ioc.relation.Person" autowire="byType">
        <property name="name" value="李星云"/>
    </bean>

    <!--byName实现自动装配-->
    <bean id="person2" class="com.kaifamiao.ioc.relation.Person" autowire="byName">
        <property name="name" value="李茂贞"/>
    </bean>
</beans>

接下来是测试类,笔者将其封装,写了两个测试类,第一个是byType,第二个是byName

package com.kaifamiao.ioc.relation;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author 后来的老李
 * @version 1.0
 */
public class AnimalTest {

    private static String configs="classpath*:com/**/relation/animal.xml";
    private static AbstractApplicationContext context;

    public @BeforeClass static void setUp(){
        context = new ClassPathXmlApplicationContext(configs);
    }

    //byType实现自动装配
    public @Test void test1(){
        Person person = context.getBean("person", Person.class);
        String p = person.getName();
        System.out.println(p);

        Dog dog = context.getBean("dog", Dog.class);
        dog.setName("哮天犬");
        String g = dog.getName();
        System.out.println(g);

        Cat cat = context.getBean("cat", Cat.class);
        cat.setName("九灵元圣");
        String t = cat.getName();
        System.out.println(t);

        person.have();
    }

    //byName实现自动装配
    public @Test void test2(){
        Person person2 = context.getBean("person2", Person.class);
        String n = person2.getName();
        System.out.println(n);

        Dog dog = context.getBean("dog", Dog.class);
        dog.setName("地狱三头犬");
        String n2 = dog.getName();
        System.out.println(n2);

        Cat cat = context.getBean("cat", Cat.class);
        cat.setName("假老练");
        String n3 = cat.getName();
        System.out.println(n3);

        person2.have();
    }

    public @AfterClass static void tearDown(){
        context.close();
    }

}

运行结果:

好,现在代码走通了,我们重点回头来看看XML文件;

    <bean id="dog" class="com.kaifamiao.ioc.relation.Dog"/>
    <bean id="cat" class="com.kaifamiao.ioc.relation.Cat"/>


    <!--byType实现自动装配-->
    <bean id="person" class="com.kaifamiao.ioc.relation.Person" autowire="byType">
        <property name="name" value="李星云"/>
    </bean>

    <!--byName实现自动装配-->
    <bean id="person2" class="com.kaifamiao.ioc.relation.Person" autowire="byName">
        <property name="name" value="李茂贞"/>
    </bean>

我们通过观察XML文件再对比测试类,为什么我们只告诉了IOC容器我们需要创建Person的对象李星云,但是并有告诉容器我们需要哮天犬和九灵元圣(这里的告诉相当于<bean>…</bean>)


byType:

那么哮天犬和九灵元圣哪里来的呢?这就是笔者要将的自动装配,第一个例子是通过byType实现自动装配的,IOC容器先创建了对象李星云,再识别到了byType,知道了要自动装配了,通过class给出的路径找到Persson类,Person类里面给了两句private Cat cat;和private Dog dog;因此IOC容器又可以创建这两个类对应的对象。这就是通过byType实现的自动转配。



byName:

那么第二个地狱三头犬和假老练哪里来的呢?是IOC在创建了Person2对应的对象,又识别到了byName,知道了要自动装配了,通过class给出的路径找到Persson类,在Person类里面找到了setDog和setCat,就知道要创建Dog和Cat了,因此IOC容器创建这两个类对应的对象。这就是通过byName实现的自动转配。



版权声明:本文为xwe_147jyz原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。