文章目录

  • Bean的自动装配
  • 1. 测试环境搭建
  • 2. byName
  • 3. byType
  • 4. 使用注解
    • 4.1 @Autowired
    • 4.2 @Qualifier
    • 4.3 @Resource
  • 5. 小结

Bean的自动装配

  • 自动装配是使用spring满足bean依赖的一种方法
  • spring会在应用上下文中为某个bean寻找其依赖的bean。

Spring中bean有三种装配机制,分别是:

  1. 在xml中显式配置(咱们之前的方式都是这种);
  2. 在java中显式配置;
  3. 隐式的bean发现机制和自动装配。

这里我们主要讲第三种:自动化的装配bean。

Spring的自动装配需要从两个角度来实现,或者说是两个操作:

  1. 组件扫描(component scanning):spring会自动发现应用上下文中所创建的bean;
  2. 自动装配(autowiring):spring自动满足bean之间的依赖,也就是我们说的IoC/DI;

1. 测试环境搭建

  1. 新建一个项目
  2. 新建两个实体类,Cat Dog 都有一个叫的方法
public class Cat {public void shout(){System.out.println("miao~");}
}
public class Dog {public void shout(){System.out.println("wang~");}
}
  1. 新建一个用户类 User
public class People {private Dog dog;private Cat cat;private String name;// get set toString 构造器
}
  1. 编写Spring配置文件。applicationContext.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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="cat" class="com.xxc.pojo.Cat"/><bean id="dog" class="com.xxc.pojo.Dog"/><bean id="people" class="com.xxc.pojo.People"><property name="name" value="江南"/><property name="cat" ref="cat"/><property name="dog" ref="dog"/></bean>
</beans>
  1. 测试
public class MyTest {@Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");People people = context.getBean("people", People.class);people.getCat().shout();people.getDog().shout();}
}

正常输出,说明环境没有问题。

2. byName

autowire byName (按名称自动装配)

由于在手动配置xml过程中,常常发生字母缺漏和大小写等错误,而无法对其进行检查,使得开发效率降低。

采用自动装配将避免这些错误,并且使配置简单化。

修改bean配置,增加一个属性 autowire=“byName”

<bean id="people" class="com.xxc.pojo.People" autowire="byName"><property name="name" value="江南"/>
</bean>

测试

public class MyTest {@Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");People people = context.getBean("people", People.class);people.getCat().shout();people.getDog().shout();}
}

再次测试,结果依旧成功输出!

注意:使用ByName自动装配,要保证id的值和实体类中set后的值一致,否则真正的setXXX就没执行,对象就没有初始化,所以调用时就会报空指针错误。

小结

当一个bean节点带有 autowire byName的属性时。

  1. 将查找其类中所有的set方法名,例如setCat,获得将set去掉并且首字母小写的字符串,即cat。
  2. 去spring容器中寻找是否有此字符串名称id的对象。
  3. 如果有,就取出注入;如果没有,就报空指针异常。

3. byType

autowire byType (按类型自动装配)

使用autowire byType首先需要保证:同一类型的对象,在spring容器中唯一。如果不唯一,会报不唯一的异常。

NoUniqueBeanDefinitionException

修改bean配置,autowire=“byType”

<bean id="people" class="com.xxc.pojo.People" autowire="byType"><property name="name" value="江南"/>
</bean>

测试,正常输出。

如果我们再注册一个cat 的bean对象。

<bean id="cat" class="com.xxc.pojo.Cat"/>
<bean id="dog" class="com.xxc.pojo.Dog"/>
<bean id="dog1" class="com.xxc.pojo.Dog"/><bean id="people" class="com.xxc.pojo.People" autowire="byType"><property name="name" value="江南"/>
</bean>

测试会报错:NoUniqueBeanDefinitionException

删掉dog1,将dog的bean名称改掉!测试!因为是按类型装配,所以并不会报异常,也不影响最后的结果。甚至将id属性去掉,也不影响结果。其实就是保证只有一个实体类的class被注入

这就是按照类型自动装配!

4. 使用注解

jdk1.5开始支持注解,spring2.5开始全面支持注解.

准备工作: 利用注解的方式注入属性。

  1. 在spring配置文件中引入context文件头
xmlns:context="http://www.springframework.org/schema/context"http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
  1. 开启属性注解支持!
<context:annotation-config/>

4.1 @Autowired

  • @Autowired是按类型自动转配的,不支持id匹配。
  • 需要导入 spring-aop的包!
xmlns:aop="http://www.springframework.org/schema/aop"http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd

测试

将People类中的set方法去掉,使用@Autowired注解(set方法可有可无)

public class People {@Autowiredprivate Dog dog;@Autowiredprivate Cat cat;private String name;
}

测试,成功输出结果。

此时的配置文件内容

applicationContext.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"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><context:annotation-config/><bean id="cat" class="com.xxc.pojo.Cat"/><bean id="dog" class="com.xxc.pojo.Dog"/><bean id="people" class="com.xxc.pojo.People"/></beans>

知识点

@Autowired(required=false) 说明: false,对象可以为null;true,对象必须存对象,不能为null。

//如果允许对象为null,设置required = false,默认为true
@Autowired(required = false)
private Cat cat;

4.2 @Qualifier

  • @Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配
  • @Qualifier不能单独使用。

测试

  1. 配置文件修改内容,保证类型存在对象。且名字不为类的默认名字。
<bean id="cat1" class="com.xxc.pojo.Cat"/>
<bean id="cat2" class="com.xxc.pojo.Cat"/>
<bean id="dog1" class="com.xxc.pojo.Dog"/>
<bean id="dog2" class="com.xxc.pojo.Dog"/>
  1. 没有加Qualifier测试,直接报错

  2. 在属性上添加Qualifier注解

@Autowired
@Qualifier(value = "dog1")
private Dog dog;
@Autowired
@Qualifier(value = "cat2")
private Cat cat;
  1. 测试

4.3 @Resource

  • @Resource如有指定的name属性,先按该属性进行byName方式查找装配;
  • 其次再进行默认的byName方式进行装配;
  • 如果以上都不成功,则按byType的方式自动装配。
  • 都不成功,则报异常。

实体类:

@Resource
private Dog dog;
@Resource(name = "cat2")
private Cat cat;
private String name;

applicationContext.xml

<bean id="cat1" class="com.xxc.pojo.Cat"/>
<bean id="cat2" class="com.xxc.pojo.Cat"/>
<bean id="dog" class="com.xxc.pojo.Dog"/>
<bean id="people" class="com.xxc.pojo.People"/>

测试

测试成功!

如果我们再修改applicationContext.xml

<bean id="cat1" class="com.xxc.pojo.Cat"/>
<bean id="dog" class="com.xxc.pojo.Dog"/>

实体类上只保留注解

@Resource
private Dog dog;
@Resource
private Cat cat;

测试

结论:@Resource先进行byName查找,如果失败;再进行byType查找,成功。

5. 小结

@Autowired与@Resource异同:

  1. @Autowired与@Resource都可以用来装配bean。都可以写在字段上,或写在setter方法上。
  2. @Autowired默认按类型装配(属于spring规范),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用。
  3. @Resource(属于J2EE规范),默认按照名称进行装配,名称可以通过name属性进行指定。如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

它们的作用相同都是用注解方式注入对象,但执行顺序不同。@Autowired先byType,@Resource先byName。

Spring学习笔记(六)。Spring自动装配,按名称自动装配:byName,按类型自动装配:byType,@Autowired,@Qualifier,@Resource相关推荐

  1. Spring学习笔记 之 Spring<全>

    开始学习Spring全家桶 文章目录 1. IoC 定义 为什么叫控制反转? 实现 IoC 容器创建 bean 的两种⽅式 IoC DI 特殊字符的处理 Spring 中的bean创建类型 -- sc ...

  2. spring学习笔记(spring概述和IOC)

    spring5 1.spring的概述 1.1.spring是什么 Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架,它是为了解决企业应用开发的复杂性而创建的. Spring 的 ...

  3. Spring学习笔记之Spring Web Flow

    Spring Web Flow 是Spring MVC 的扩展,它支持开发基于流程的应用程序.它将流程的定义与实现流程行为的类和视图分离开来. 1.配置Web Flow 在Spring MVC上下文定 ...

  4. Spring学习笔记:Spring整合Mybatis(mybatis-spring.jar)(二:mybatis整合spring)

    http://blog.csdn.net/qq598535550/article/details/51703190 二.Spring整合mybatis其实是在mybatis的基础上实现Spring框架 ...

  5. spring学习笔记 -- day02 spring基础、IOC控制反转

    一:srping的介绍 1.spring的体系结构 2.spring资源 a.spring-framework-4.2.4.RELEASE:Spring Framework的官方发行包 b.sprin ...

  6. Java学习笔记-Day64 Spring 框架(二)

    Java学习笔记-Day64 Spring 框架(二) 一.控制反转IOC和依赖注入DI 1.控制反转IOC 2.依赖注入DI 3.Spring IOC容器 3.1.简介 3.2.实现容器 3.2.获 ...

  7. JavaEE——Spring学习笔记01【Ioc开发的模式】

    JavaEE--Spring学习笔记01[Ioc开发的模式] JavaEE--Spring学习笔记02[Spring和Mybatis的整合] JavaEE--Spring学习笔记03[AOP开发] J ...

  8. Spring学习笔记之MyBatis

    系列文章目录 Spring学习笔记 之 Springhttps://blog.csdn.net/weixin_43985478/article/details/124411746?spm=1001.2 ...

  9. spring学习笔记06-spring整合junit(出现的问题,解决的思路)

    spring学习笔记06-spring整合junit(出现的问题,解决的思路) 文章目录 spring学习笔记06-spring整合junit(出现的问题,解决的思路) 3.1测试类中的问题和解决思路 ...

  10. Spring学习笔记:配置单数据源

    Spring学习笔记:配置单数据源 一.Spring Boot默认数据源类型 Springboot默认支持4种数据源类型,定义在 org.springframework.boot.autoconfig ...

最新文章

  1. 机器人造iPhone,苹果奋斗八年,还是败给了富士康工人
  2. elif在python中啥意思_python中elif 结构语句怎么判断?
  3. 如何促使团队紧密协作
  4. hdoj 4450 Draw Something 水题
  5. centos 杀死进程命令kill
  6. 信号转化java_Java基础知识回顾-7
  7. 图(关系网络)数据分析及阿里应用
  8. 数据结构-链表4-企业链表
  9. iOS 浅复制和深复制的深层理解,含示例
  10. bada 2D游戏编程之八——逐帧动画
  11. 计算机面试 OA 试题及答案,办公自动化题库OA(附答案)
  12. bootstrap表格标题Caption位于表格下方的原因
  13. Pandownload 开发者被抓了,但是其背后,百度难道不需要反思吗?
  14. 外部js文件中调用pinia时,报错getActivePinia was called with no active Pinia. Did you forget to install pinia?
  15. 【47.40%】【BZOJ 1875】[SDOI2009]HH去散步
  16. PostgreSQL V10逻辑复制
  17. 宝塔Linux面板的安装配置以及基本使用教程(超详细)
  18. IT圈子很小,遭遇人肉搜索后果很严重
  19. [paper share]KDD15 - Interpreting Advertiser Intent in Sponsored Search
  20. verilog中>>>和>>的区别

热门文章

  1. Qt扫盲-QThread使用总结
  2. Python定时任务库schedule的使用
  3. 扩展欧几里得及其应用
  4. 开展软件下载平台需要办理互联网信息服务许可证ICP吗?
  5. 如何使用asp.net开发一套完整的智慧小区物业系统
  6. oracle函数max,oracle max()函数和min()函数
  7. JS给指定元素添加父元素
  8. 华为岗位分类对工作的分析与启示
  9. 计算机网络三大基本的功能,Internet
  10. 把web程序打包成exe安装文件