热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【Spring】bean的自动装配

前言自动装配是Spring满足bean依赖的一种方式Spring会在上下文中自动寻找,并自动给bean装配属性(这个属性一般是指bean里面嵌套bea

前言


  • 自动装配是Spring满足bean依赖的一种方式
  • Spring会在上下文中自动寻找,并自动给bean装配属性(这个属性一般是指bean里面嵌套bean)

主要有以下两种方式:

  • 在xml中显式配置
  • 隐式自动装配bean【注解】

在xml中显式配置

初代版xml

<bean id&#61;"cat" class&#61;"com.kuang.pojo.Cat"/><bean id&#61;"dog" class&#61;"com.kuang.pojo.Dog"/><bean id&#61;"people" class&#61;"com.kuang.pojo.People"><property name&#61;"name" value&#61;"小白莲"/><property name&#61;"cat" ref&#61;"cat"/><property name&#61;"dog" ref&#61;"dog"/>bean>

ByName自动装配


<bean id&#61;"people" class&#61;"com.kuang.pojo.People" autowire&#61;"byName"><property name&#61;"name" value&#61;"小白莲"/>
bean>

ByType自动装配


<bean id&#61;"people" class&#61;"com.kuang.pojo.People" autowire&#61;"byType"><property name&#61;"name" value&#61;"小白莲"/>
bean>

小结&#xff1a;

  • ByName的时候&#xff0c;需要保证所有bean的id唯一&#xff0c;并且这个bean需要和自动注入的属性的set方法的值一致&#xff01;
  • ByType的时候&#xff0c;需要保证所有bean的class唯一&#xff0c;并且这个bean需要和自动注入的属性的类型一致&#xff01;如果class不唯一&#xff0c;可以运行&#xff0c;但可能不是想要的对象

使用注解实现自动装配

jdk1.5支持注解&#xff0c;Spring2.5支持注解
使用注解须知&#xff1a;

  • 导入约束头文件
  • 配置注解的支持


<beans xmlns&#61;"http://www.springframework.org/schema/beans"xmlns:xsi&#61;"http://www.w3.org/2001/XMLSchema-instance"xmlns:context&#61;"http://www.springframework.org/schema/context"xsi:schemaLocation&#61;"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>

&#64;Autowired

直接在属性上使用即可&#xff01;也可以在set方法上使用&#xff01;

使用Autowired我们就可以不用编写set方法了&#xff0c;前提是你这个自动配置的属性在IOC&#xff08;Spring&#xff09;容器中存在&#xff0c;且符合名字ByName&#xff01;

  • &#64;Nullable 字段标记了了这个注解&#xff0c;说明这个字段可以为null;
  • &#64;Autowired(required &#61; false)

如果&#64;Autowired自动装配的环境比较复杂&#xff0c;自动装配无法通过一个注解【&#64;Autowired】完成的时候&#xff0c;我们可以使用&#64;Qualifier(value &#61; “xxx”)去配置&#64;Autowired的使用&#xff0c;指定一个唯一的bean对象注入&#xff01;

&#64;Resource和&#64;Autowired的区别&#xff1a;

都是用来自动装配的&#xff0c;都可以放在属性字段上
&#64;Autowired通过byType的方式实现&#xff0c;而且必须要求这个对象存在&#xff01;【常用】所以byType不需要用set方法
&#64;Resource默认通过byName的方式实现&#xff0c;如果找不到名字&#xff0c;则通过byType实现&#xff01;如果两个都找不到的情况下&#xff0c;就报错&#xff01;【常用】
执行顺序不同&#xff1a;&#64;Autowired通过byType的方式实现。

package com.pojo;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;import javax.annotation.Resource;public class People {&#64;Resourceprivate Cat cat;&#64;Autowired&#64;Qualifier(value &#61; "dog")private Dog dog;private String name;&#64;Overridepublic String toString() {return "People{" &#43;"cat&#61;" &#43; cat &#43;", dog&#61;" &#43; dog &#43;", name&#61;&#39;" &#43; name &#43; &#39;\&#39;&#39; &#43;&#39;}&#39;;}public Cat getCat() {return cat;}// public void setCat(Cat cat) {
// this.cat &#61; cat;
// }public Dog getDog() {return dog;}// public void setDog(Dog dog) {
// this.dog &#61; dog;
// }public String getName() {return name;}public void setName(String name) {this.name &#61; name;}
}

总结

byType&#xff1a;&#64;Autowired 根据bean中的属性名匹配&#xff0c;也就是通过class
byName&#xff1a;根据bean中的set方法对应的值&#xff0c;这个是通过property的name
&#64;Autowired直接放属性名&#xff0c;特别地可以有多个名字&#xff0c;用Qualifier&#xff0c;如果require为false就可以为null
&#64;Resource先默认通过byName&#xff0c;如果没有set或找不到对应的名字&#xff0c;则变成byType


推荐阅读
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
author-avatar
小仙女
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有