Spring——Bean的自动装配
- 自动装配是Spring满足bean依赖的一种方式
- Spring会在上下文中自动寻找,并自动给bean装配属性
Spring中有三种装配方式
- 1、在xml中显示的配置
- 2、在Java中显示的配置
- 3、隐式的自动装配bean(重点)
测试
要求:一个人有两个宠物
1.新建spring-05-Autowired模型
2.新建com.kuang.pojo包存放实体类对象
Cat类:
package com.kuang.pojo;public class Cat {public void shout(){System.out.println("miao~~");}
}
Dog类:
package com.kuang.pojo;public class Dog {public void shout(){System.out.println("wang~~");}
}
People类:
import com.kuang.pojo.People;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class myTest {@Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");People people = context.getBean("people", People.class);
// System.out.println(people);people.getCat().shout();people.getDog().shout();}
}
3.创建配置文件beans.xml
3.1 手动装配方式
<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!--手动装配--><bean id="people" class="com.kuang.pojo.People"><property name="name" value="晓晓"></property><property name="dog" ref="dog"></property><property name="cat" ref="cat"></property></bean><bean id="dog" class="com.kuang.pojo.Dog"></bean><bean id="cat" class="com.kuang.pojo.Cat"></bean></beans>
3.2自动装配方式:ByName
<!-- 自动装配,通过byName-->
<!-- byName:会自动在容器上下文查找,和自己对象set方法后面的值对应的beanId
--><bean id="people" class="com.kuang.pojo.People" autowire="byName"><property name="name" value="晓晓"></property></bean>
<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 自动装配,通过byName-->
<!-- byName:会自动在容器上下文查找,和自己对象set方法后面的值对应的beanId--><bean id="dog" class="com.kuang.pojo.Dog" /><bean id="cat" class="com.kuang.pojo.Cat" /><bean id="people" class="com.kuang.pojo.People" autowire="byName"><property name="name" value="晓晓"></property></bean></beans>
如果不对应会出现空指针异常
3.3自动装配方式:byType
要保证类型全局唯一
<!-- 自动装配,通过byType--><!-- byType:会自动在容器上下文查找,和自己对象属性类型相同的bean保证类型全局唯一可以不填对象id,因为根据的是对象的类型--><bean class="com.kuang.pojo.Dog" /><bean class="com.kuang.pojo.Cat" /><bean id="people" class="com.kuang.pojo.People" autowire="byType"><property name="name" value="晓晓"></property></bean>
<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 自动装配,通过byType--><!-- byType:会自动在容器上下文查找,和自己对象属性类型相同的bean保证类型全局唯一可以不填对象id,因为根据的是对象的类型-->
<!-- <bean id="dog" class="com.kuang.pojo.Dog" />-->
<!-- <bean id="cat" class="com.kuang.pojo.Cat" />--><bean class="com.kuang.pojo.Dog" /><bean class="com.kuang.pojo.Cat" /><bean id="people" class="com.kuang.pojo.People" autowire="byType"><property name="name" value="晓晓"></property></bean></beans>
3.4自动装配方式小结:
- byName时,要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法值一致
- byType时,要保证bean的class唯一,并且这个bean需要和自动注入的属性的类型一致
3.5 注解实现自动装配
jdk1.5支持的注解,Spring2.5就开始支持注解了
要使用注解须知:
1.导入约束。context约束
2.配置注解的支持:context:annotation-config/
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><!-- 开启注解支持--><context:annotation-config/></beans>
3.5.1@Autowired
- 直接在属性上使用即可!也可以在set方式上使用
- 使用Autowired我们可以不再编写Set方法了,前提是你这个自动装配的属性在IOC(Spring)容器中存在,且符合名字byName
科普:
@Nullable 字段标记了这个注解,说明这个字段可以为null
public @interface Autowired {boolean required() default true;
}
People对象:
package com.kuang.pojo;import org.springframework.beans.factory.annotation.Autowired;public class People {// 如果显示定义了Autowired的required属性为false,说明这个对象可以为null,否则不允许为空@Autowired(required = false)private Cat cat;@Autowiredprivate Dog dog;private String name;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;}@Overridepublic String toString() {return "People{" +"cat=" + cat.toString() +", dog=" + dog.toString() +", name='" + name + '\'' +'}';}
}
beans.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><!-- 开启注解支持--><context:annotation-config/><!-- 注解装配--><bean id="dog" class="com.kuang.pojo.Dog" /><bean id="cat" class="com.kuang.pojo.Cat" /><bean id="people" class="com.kuang.pojo.People" /></beans>
3.5.2 如果@Autowired自动装配的环境比较复杂(比如bean的类型不唯一时),自动装配无法通过一个注解【@Autowired】完成时,我们可以使用@Qualifier(value=“xxx”)去配置@Autowired使用,指定一个唯一的bean对象注入
例:
people类
package com.kuang.pojo;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;public class People {@Autowired//我们可以使用@Qualifier(value="xxx")去配置@Autowired使用,指定一个唯一的bean对象注入@Qualifier(value = "cat1")private Cat cat;@Autowired@Qualifier(value = "dog1")private Dog dog;private String name;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;}@Overridepublic String toString() {return "People{" +"cat=" + cat.toString() +", dog=" + dog.toString() +", name='" + name + '\'' +'}';}
}
beans.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><!-- 开启注解支持--><context:annotation-config/><!-- 注解装配-->
<!-- 下面bean的类型不唯一--><bean id="dog1" class="com.kuang.pojo.Dog" /><bean id="cat1" class="com.kuang.pojo.Cat" /><bean id="dog22" class="com.kuang.pojo.Dog" /><bean id="cat22" class="com.kuang.pojo.Cat" /><bean id="people" class="com.kuang.pojo.People" /></beans>
3.5.3 @Resource注解:
●要么类型唯一
●要么名字匹配
//可以通过加name来指定名字@Resource(name = "cat12")
People类
package com.kuang.pojo;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;import javax.annotation.Resource;public class People {@Resourceprivate Cat cat;@Resourceprivate Dog dog;private String name;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;}@Overridepublic String toString() {return "People{" +"cat=" + cat.toString() +", dog=" + dog.toString() +", name='" + name + '\'' +'}';}
}
beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><!-- 开启注解支持--><context:annotation-config/><!-- 注解装配-->
<!-- 使用@Resource时类型唯一,名字可以不匹配-->
<!-- <bean id="dog" class="com.kuang.pojo.Dog" />-->
<!-- <bean id="cat1" class="com.kuang.pojo.Cat" />-->
<!-- <bean id="people" class="com.kuang.pojo.People" />--><!-- 使用@Resource时类型不唯一,则至少要有一组名字匹配--><bean id="dog" class="com.kuang.pojo.Dog" /><bean id="cat" class="com.kuang.pojo.Cat" /><bean id="dog22" class="com.kuang.pojo.Dog" /><bean id="cat22" class="com.kuang.pojo.Cat" /><bean id="people" class="com.kuang.pojo.People" /></beans>
3.5.4 小结
- @Resource和@Autowired的区别:
相同点:
●都是用来自动装配的,都可以放在属性字段上
不同点:
●@Autowired通过byType的方式实现,而且必须要求这个对象存在
●@Resource默认通过byName方式实现,如果找不到名字,则通过byType实现!如果两个都找不到,就会报错
●执行顺序不同:
@Autowired通过byType的方式实现。
@Resource默认通过byName方式实现
4.创建测试类
import com.kuang.pojo.People;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class myTest {@Testpublic void test(){// 获取Spring容器ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");People people = context.getBean("people", People.class);
// System.out.println(people);people.getCat().shout();people.getDog().shout();}
}
Spring——Bean的自动装配相关推荐
- Spring精华问答 | Spring Bean的自动装配是怎么回事?
戳蓝字"CSDN云计算"关注我们哦! Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Sprin ...
- 万字详解! Spring Bean的自动装配
点击上方 Java学习之道,选择 设为星标 每天18点,干货准时奉上! 何为自动装配 自动装配是 Spring 满足 bean 依赖的一种方式. 在使用 Spring 配置 bean 时,我们都要给配 ...
- 请解释Spring Bean 的自动装配?
在Spring 框架中,在配置文件中设定bean 的依赖关系是一个很好的机制,Spring 容器还可以自动装配合作关系bean 之间的关联关系.这意味着Spring 可以通过向Bean Factory ...
- Spring bean的自动装配
配置bean 配置形式:基于xml文件的方式:基于注解的方式 bean的配置方式:通过全类名(反射),通过工厂方法(静态工厂方法和实例工厂方法),FactoryBean Car类 package co ...
- [Spring]Bean的自动装配
Spring支持5种自动装配模式,如下: 1.no --默认情况下,不自动装配,通过"ref"attribute手动设定. 2.buName --根据Property的Name自动 ...
- Spring Bean的自动装配方式
1.no:这是默认设置,表示没有自动装配.应使用显式 bean 引用进行装配. 2.byName:它根据 bean 的名称注入对象依赖项.它匹配并装配其属性与 XML文件中由相同名称定义的 bean. ...
- Spring之 Bean的自动装配
什么是Spring Bean的自动装配? 自动装配是Spring满足bean依赖一种方式 Spring会在上下文种自动寻找,并自动给bean装配属性 Spring种有三种装配方式 1.在xml种显示配 ...
- Spring基础——在 Spring Config 文件中基于 XML 的 Bean 的自动装配
一.Spring IOC 容器支持自动装配 Bean,所谓自动装配是指,不需要通过 <property> 或 <constructor-arg> 为 Bean 的属性注入值的过 ...
- java 自动装载_java_详解Java的Spring框架下bean的自动装载方式,Spring容器可以自动装配相互协 - phpStudy...
详解Java的Spring框架下bean的自动装载方式 Spring容器可以自动装配相互协作bean之间的关系,这有助于减少对XML配置,而无需编写一个大的基于Spring应用程序的较多的和元素. 自 ...
最新文章
- 【机器视觉】探索机器学习理论的最新进展,走近云、端、芯上的视觉计算
- 使用负载均衡SLB IPv6搞定苹果AppStore审核
- pycharm专业版-2017.3.3 安装+anaconda3-2019.03-windows
- linux 找出耗io的,linux根据io消耗找进程
- HDU 3683 Gomoku
- 工作197:判断对象里面是否有0和1
- 快速搭建springmvc+spring data jpa工程
- linux修改目录为nobody,nfs只能挂载为nobody的解决方法
- JMeter中持续时间设置成永远调度器才会起作用
- ExtJS4.2学习(七)EditorGrid可编辑表格(转)
- python将对象放入列表_将所有python-rom对象放入列表
- wpf 执行mysql命令_WPF(.net 3.5)使用MySql.Data.dll进行mysql数据库操作
- 在移动端H5开发中(关于安卓端position:fixed和position:absolute;和虚拟键盘冲突的问题,以及解决方案)...
- 一位70后的感叹:下半辈子我会陷入贫困吗?
- 石文软件测试,石文软件基本操作
- proxy_cfw全局代理_浏览器代理配置(chromium based(edge)/firefox/IDM)
- 免费FTP资源(比较全)
- html页面内容上下左右居中,HTML元素水平垂直居中实现方式(每天一个知识点)...
- 【其他笔记】 双屏显示分辨率低下、屏幕闪烁、暗沉等问题。
- 22张图带你了解IP地址有什么作用
热门文章
- 使用Qt二次开发周立功CAN(一)
- 一些常用的sql命令记录
- 全球wcdma运营频段
- POJ 1984 Navigation Nightmare 多权值并查集
- C++(第十三篇):二叉搜索树(二叉树进阶、二叉搜索树的结构、应用及模拟实现)
- uniapp集成colorUI uView2.0 Vuex
- 从live555 实战中了解MakeFile
- 【人工智能】自动驾驶的核心技术介绍
- php android 微信支付,Android_Android实现微信支付功能,开发Android APP微信支付功能, - phpStudy...
- 下次适应(Next Fit)算法 | 存储分配 | Java实现(详细注释)