Spring的注入方式详解
- Spring的注入方式详解
- Spring有三个注入方式,type1,type2,type3
- type1 接口依赖
- type2 setter/getter
- type3 构造方法
- type2,type3较用常用
- 首先来看一下type2
- type2 setter/getter(引用注入)
- 例如,存在一个User类和Home类
- user类里一个userName;一个Home对象的属性.
- public class User {
- private String userName;
- private Home myHome;
- public Home getMyHome() {
- return myHome;
- }
- public void setMyHome(Home myHome) {
- this.myHome = myHome;
- }
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- }
- public class Home {
- private String homeAddr;
- public String getHomeAddr() {
- return homeAddr;
- }
- public void setHomeAddr(String homeAddr) {
- this.homeAddr = homeAddr;
- }
- }
- public class TestMain {
- public static void main(String[] args) {
- ApplicationContext context=new FileSystemXmlApplicationContext("test/lyx/applicationContext.xml");
- User user1=(User)context.getBean("user");
- System.out.println(“姓名为: ”+user1.getUserName());
- System.out.println(“家庭住址是: ”+user1.getMyHome().getHomeAddr());
- }
- }
- 将两个bean的注入:(applicationContext.xml配置如下)
- <bean id="home" class="test.lyx.Home" abstract="false"
- singleton="true" lazy-init="default" autowire="default"
- dependency-check="default">
- <property name="homeAddr">
- <value>大连</value>
- </property>
- </bean>
- <bean id="user" class="test.lyx.User" abstract="false"
- singleton="true" lazy-init="default" autowire="default"
- dependency-check="default">
- <property name="userName">
- <value>liuyuanxi</value>
- </property>
- <property name="myHome">
- <ref bean="home"/>
- </property>
- </bean>
- 这里的user bean,引用了home bean,
- 运行时会打出
- 姓名为:liuyuanxi
- 家庭住址是:大连
- 这种方式就是setter/getter方式注入,习惯用JavaBean的人应该很容易理解这种方法,也就是能过<property name="userName">来指定属性. <value>liuyuanxi</value>来指定属性所对应的值.多少个属性就有多少个<property>
- 这里一个人,和家是两个类,也提到了两个bean之间的引用.也就是user bean给名字赋了值,home bean给地址赋了值.如果在user bean中想引入 home bean中的地址.就用<ref/>不再用<values>
- type3 构造方法注入
- 这里我们在User里加入一个构造器
- public User(Home myHome){
- this.myHome=myHome;
- }
- 然后 把配置文件改一下:autowire=constructor;
- <bean id="home" class="test.lyx.Home" abstract="false"
- singleton="true" lazy-init="default" autowire="default"
- dependency-check="default">
- <property name="homeAddr">
- <value>大连</value>
- </property>
- </bean>
- <bean id="user" class="test.lyx.User" abstract="false"
- singleton="true" lazy-init="default" autowire=" constructor "
- dependency-check="default">
- <property name="userName">
- <value>liuyuanxi</value>
- </property>
- <property name="myHome">
- <ref bean="home"/>
- </property>
- </bean>
- 运行时会打出
- 姓名为:liuyuanxi
- 家庭住址是:大连
- 这种方式就是构造器注入
- 我们再来看看spring的绑定
- 也就是通过bean属性autowire来设置
- 1. 通过bean属性autowire="byType"的设置可以使用bean在运行时候根据去寻找同类型的已定义属性,如果找不到则处于未绑定状态.(已定义好指在applicationContext.xml中初始化)这里我们把配置文件的 user bean的autowire改成autowire="byType",注意一定要把User的构造器去掉,要不然先找构造器,会出错.这里的home bean是属于,test.lyx.Home类型的,而user bean里有两个属性一个属性已经初始化,而另一个属性Home,就会自动找到.
- applicationContext.xml配置如下:
- <bean id="home" class="test.lyx.Home" abstract="false"
- singleton="true" lazy-init="default" autowire="default"
- dependency-check="default">
- <property name="homeAddr">
- <value>大连</value>
- </property>
- </bean>
- <bean id="user" class="test.lyx.User" abstract="false"
- singleton="true" lazy-init="default" autowire=" byType "
- dependency-check="default">
- <property name="userName">
- <value>liuyuanxi</value>
- </property>
- <property name="myHome">
- <ref bean="home"/>
- </property>
- </bean>
- 运行时会打出
- 姓名为:liuyuanxi
- 家庭住址是:大连
- 这种方式就是构造器注入
- 但这样的寻找方式有一个弱点,
- 假如再注入一个Home bean,叫home1,运行时就会找到两个bean,出错.
- <bean id="home1" class="test.lyx.Home" abstract="false"
- singleton="true" lazy-init="default" autowire="default"
- dependency-check="default">
- <property name="homeAddr">
- <value>beijing</value>
- </property>
- </bean>
- 如果我们想解决这种问题也很简单,我们可以把autowire改为,autowire="byName"方式来寻找.
- 但是这里一定要注意:Home bean的id名,一定要和属性名字一样.这里应该改成,id="myHome"
- <bean id="home1" class="test.lyx.Home" abstract="false"
- singleton="true" lazy-init="default" autowire="default"
- dependency-check="default">
- <property name="homeAddr">
- <value>dalian</value>
- </property>
- </bean>
- <bean id="myHome" class="test.lyx.Home" abstract="false"
- singleton="true" lazy-init="default" autowire="default"
- dependency-check="default">
- <property name="homeAddr">
- <value>北京</value>
- </property>
- </bean>
- 这样的话
- 运行时会打出
- 姓名为:liuyuanxi
- 家庭住址是:北京
- 而不在是大连了,这种寻找方式就是byName,也就是按属性的名字进行查询.注意:id一定要属性的名字一样.
- 2.我们来比较一个byname和 bytype这两种方式.
- byname要比bytype精确些,因为id,是不能重名的.
- 而且假如存在一这样一种情况,两个user bean,分别为user1,user2,那么user1,user2都可以,打出北京.重用性很好.
- 到这可能有人会想到.user1,和user2调用的是同一个Home吗.你可以把他们的hashcode();打出来,你会发现地址是一样的,也就是说,是同一个bean.这里是因为singleton="true"的原因,如果你把singleton改成了"false"那就不是一个对象了.
- 3.如果把autowire=” constructor”也就是构造器注入一定要注意了,他是以byType进行查找,也就是说,Home bean,是不能出现两次,否则就会出错了.
- 4.如果autowire设置成为autodetect,他会一直找,直到找到一个合适的为止.constructor,bytype,byname的顺序去找.这种方式是不推荐使用的.因为你很难判断出执行的是那个.
Spring的注入方式详解相关推荐
- Spring 依赖注入方式详解
平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...
- @Resource,@Autowired,@Inject3种注入方式详解
转载自 @Resource,@Autowired,@Inject3种注入方式详解 概况 @Resource,@Autowired,@Inject 这3种都是用来注入bean的,它们属于不同的程序中. ...
- spring依赖注入原理详解(转载)
spring依赖注入原理详解----转载 所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中.当spring容器启动后,spring容器初始化,创建并管理bean对象,以及销毁它.所 ...
- spring的依赖注入方式详解
第一种:使用setter注入 直接使用bean元素的子元素property进行相关的设置 ①简单类型,直接使用value进行赋值. <bean id="somebean" c ...
- spring依赖注入原理详解
所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中.当spring容器启动后,spring容器初始化,创建并管理bean对象,以及销毁它.所以我们只需从容器直接获取Bean对象就行, ...
- Spring中bean的执行初始化和销毁方法的4种方式详解
一.引入 在java的实际开发过程中,我们可能需要在spring实例化一个bean的过程中,使用到初始化一个对象(bean)后立即初始化(加载)一些数据,或者在销毁一个对象之前进行执行一些事情等等. ...
- Spring EL表达式使用详解
Spring EL表达式使用详解 什么是Spring EL表达式 注入字面值 注入操作系统(OS)的属性 注入properties配置文件中数据 Bean属性调用 Bean方法调用 T运算符 构造器 ...
- java 消息队列详解_Java消息队列-Spring整合ActiveMq的详解
本篇文章主要介绍了详解Java消息队列-Spring整合ActiveMq ,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 1.概述 首先和大家一起回顾一下Java 消息服 ...
- Java程序员从笨鸟到菜鸟之(一百)sql注入攻击详解(一)sql注入原理详解
前段时间,在很多博客和微博中暴漏出了12306铁道部网站的一些漏洞,作为这么大的一个项目,要说有漏洞也不是没可能,但其漏洞确是一些菜鸟级程序员才会犯的错误.其实sql注入漏洞就是一个.作为一个菜鸟小程 ...
最新文章
- 6、数据库设计为什么要使用三大范式
- 防火墙未开启导致通过redis篡改.ssh/authorized_keys
- [C/C++] constexpr函数
- SAP Spartacus B2B user列表对应的Angular Component
- java先进先出 循环队列,JavaScript队列、优先队列与循环队列
- 贪婪洞窟2服务器维护,《贪婪洞窟2》11月30日更新维护多久 贪婪洞窟2更新维护公告...
- 统考计算机和英语百度网盘,《计算机专业英语》在线考试系统
- 日志log4j配置详情,日志log具体到你想不到
- PHP什么架构,PHP是什么-PHP的架构及道理概述_后端开发
- 清华姚班毕业生开发新特效编程语言,99行代码实现《冰雪奇缘》,网友:大神碉堡!创世的快乐
- Python 数据处理 | 详解缩尾处理(winsorize)和代码实践
- 想学python网课哪个好-推荐书单(网课)-人生/编程/Python/机器学习-191本
- 数据驱动测试一:使用TestNG进行数据驱动
- codeforces-1202C-WASD-string
- Apache 防盗链(Apache Anti-Leech)技术的简单实现
- 使用selenium爬取fofa中的网站链接
- 微信小程序上传阿里云视频文件流程及代码
- 转盘游戏简单原理设计
- 基于springboot地方旅游系统的设计与实现
- Codeforces 1207 C. Gas Pipelin(线性DP)
热门文章
- 七牛云 转码_YYC松鼠短视频系统V2.0版本发布,亮点新增转码加水印功能
- echarts曲线太多卡顿怎么优化_光刻胶旋涂曲线如何获得?
- OpenShift 4 - 部署 RabbitMQ 集群
- OpenShift 4 - 安装 OpenShift 集群后如何删除节点或增加新节点
- (四)在MLOps管道中进行持续训练
- Steroids上的SQL Server Express Edition
- Microsoft Blazor——快速开发与SQL Forms开源平台Platz.SqlForms
- 使用.NET Core 3进行Linux编程:第3章
- 突发!美国国会发函要求 Facebook 立即停止 Libra 项目
- 相比 Windows 为什么越来越多人选择Linux?