这篇文章笔者和大家聊一聊自动装配,首先我们学习它的时候我们应该知道何为自动装配?
举个例子:一个人他有一只狗和一只猫,他有的 这两个动物就相当于这个人的名字一样,写在一个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实现的自动转配。