Java(Spring)学习笔记--->自动装配(autowire)
这篇文章笔者和大家聊一聊自动装配,首先我们学习它的时候我们应该知道何为自动装配?
举个例子:一个人他有一只狗和一只猫,他有的 这两个动物就相当于这个人的名字一样,写在一个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/beanshttp://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实现的自动转配。
Java(Spring)学习笔记--->自动装配(autowire)相关推荐
- Spring学习笔记--自动装配Bean属性
Spring提供了四种类型的自动装配策略: byName – 把与Bean的属性具有相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中. byType – 把与Bean的属性具有相同类型 ...
- java 自动装载_java_详解Java的Spring框架下bean的自动装载方式,Spring容器可以自动装配相互协 - phpStudy...
详解Java的Spring框架下bean的自动装载方式 Spring容器可以自动装配相互协作bean之间的关系,这有助于减少对XML配置,而无需编写一个大的基于Spring应用程序的较多的和元素. 自 ...
- Spring自动装配-autowire
目录 1.自动装配-autowire 2.autowire的四种模式 3.使用自动装配 3.1 使用byName自动装配 3.2 使用byType自动装配 资源类和配置文件 1.自动装配-autowi ...
- Spring自动装配 autowire
什么是自动装配? 自动装配就是让应用程序上下文为你找出依赖项的过程.说的通俗一点,就是Spring会在上下文中自动查找,并自动给bean装配与其关联的属性! spring中实现自动装配的方式有两种,一 ...
- JavaEE——Spring学习笔记01【Ioc开发的模式】
JavaEE--Spring学习笔记01[Ioc开发的模式] JavaEE--Spring学习笔记02[Spring和Mybatis的整合] JavaEE--Spring学习笔记03[AOP开发] J ...
- Spring精华问答 | Spring Bean的自动装配是怎么回事?
戳蓝字"CSDN云计算"关注我们哦! Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Sprin ...
- 尚学堂JAVA高级学习笔记_1/2
尚学堂JAVA高级学习笔记 文章目录 尚学堂JAVA高级学习笔记 写在前面 第1章 手写webserver 1. 灵魂反射 2. 高效解析xml 3. 解析webxml 4. 反射webxml 5. ...
- CHY的Spring学习笔记---师从动力节点王鹤老师(B站白嫖)
Spring学习笔记 核心技术:ioc和aop ioc:使用di(依赖注入)实现控制反转,底层使用的是反射机制 spring可以创建自己写的类的对象,也可以创建非自定义对象,只要知道类的全限定名即可. ...
- Spring抛出异常_自动装配
Spring自动装配(autowire)出错 报错如下: org.springframework.beans.factory.UnsatisfiedDependencyException: Error ...
- Spring Boot(一) 自动装配--约定大于配置
欢迎去我的个人博客--晓坞坐坐,里面有很多有趣的文章,不止是技术.www.lixiaodongisme.com 随着spring体系的发展,我们在开发时需要配置整合的东西也越来越多,在进行开发时,繁琐 ...
最新文章
- 如何挽回一个快要“变心”的买家?
- VSCode插件开发全攻略(六)开发调试技巧
- C语言每日一题之No.9
- vue属性_computed(计算属性)methods(方法)
- 图像处理软件Acorn for Mac如何创建新图像?
- 解决 No utmpx entry. You must exec login from the lowest level shell.
- 数据库服务器信息填写,数据库服务器是怎么填写
- python 批量word文档转pdf
- 从Visual SourceSafe (VSS)服务器下载文件(C#)
- poEdit制作WordPress主题汉化,插件汉化攻略
- 在美团,我从暑期实习到转正
- ramda 函数 Function
- 脚本 金盾替换机器码_金盾2018SS加密视频机器码替换工具的分析过程三
- 中小企业成本的会计核算方法
- 计算机管理无法定位程序输入点,win10系统打开程序提示无法定位程序输入点于动态链接库怎么办...
- A卡核显N卡独显笔记本Deepin20环境下配置双显卡驱动和CUDA
- GCC源码分析(摘)
- 5个超棒的自我提升App
- 多级表头 el-table-column的使用
- layui数据表格的字体颜色