Spring的Bean配置
IOC和DI
网上概念很多,感兴趣可以去搜一搜,在这里我就给个比喻:
IOC:以前我们买东西都要去商店买,用了IOC之后,我们只要在门口放个箱子, Spring就会给我相应商品,ಠᴗಠ
举个例子
- class A{}
- class B{
- private A a;
- public void setA(A a){
- this.a=a;
- }
- }
在传统的写法中,在创建A B对象,他们之间的关联需要我们手动设置,b.set(a),而在使用Spring之后,这一步就不需要了,由框架为我们设置相关内容
IOC的发展:
- 分离接口与实现
- 工厂设计模式
- 翻转控制
基于XML配置bean
<bean>中的class属性填入bean的全类名,通过反射方式在IOC容器中创建Bean,所以要求Bean中必须有无参的构造函数。
属性id用来表示容器中的id,id唯一
ApplicationContext代表IOC容器,实际这是一个接口。在SpringIOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化,只有在容器实例化后,才可以从IOC容器里获取Bean实例并使用。
Spring为我们提供了两种类型的IOC容器实现:
- BeanFactory:IOC容器的基本实现
- ApplicationContext:提供了更多高级特性,是BeanFactory的子接口
- ClassPathXmlApplicationContext是ApplicationContext的实现类
BeanFactory是Spring的基础设施,面向Spring本身,ApplicationContext面向Spring框架开者,几乎所有应用场合都直接使用ApplicationContext而非底层BeanFactory,当然,无论使用何种方式,配置文件都相同。

ApplicationContext的主要实现类:
ClassPathXmlApplicationContext:从类路径下加载配置文件
FileSystemXmlApplicationContext:从文件系统中加载配置文件

ConfigurableApplicationContext扩展于ApplicationContext,新增两个主要方法:refresh()和close(),让ApplicationContext具有启动/刷新和关闭上下文的功能。
ApplicationContext在初始化上下文时就实例化所有单例的Bean。
WebApplication是专门为WEB应用而准备的,它允许从相对于WEB根目录的路径中完成初始化工作。
接下来说说getBean()这个方法,getBean()这个方法实际是存在在BeanFactory这个接口中,我们看看下面这张截图:

非常多个重载,我们在之前的例子中也可以这么写,利用类型返回IOC容器:
HelloWorld helloWorld = ctx.getBean(HelloWorld.class);
也是没问题的,这样有缺点吗?
加入我在配置文件中创建了两个<bean>并且都是HelloWorld的JavaBean,这样Spring就识别不出是哪一个<bean>了,因此不推荐这么写,推荐通过id名返回IOC容器,创建对象
HelloWorld helloWorld = (HelloWorld) ctx.getBean("helloWorld");
依赖注入
- 属性注入
- 构造器注入
- 工厂方法注入(很少使用,不推荐)
先说说最常用的属性注入,这个属性注入就是我们先前HelloWorld中使用的方法,通过setter方法注入Bean的属性值或依赖的对象,通过<property>标签,使用name指定Bean的属性名称,value属性指定属性值
<property name="name" value="World"></property>
接着说构造方法注入,通过构造方法注入Bean的属性值或依赖对象,它保证了Bean实例在实例化后就可以使用。
构造器注入需要用<constructor-arg>元素里声明属性,注意<constructor-arg>中没有name属性
我们新创建Car类作为测试:
- public class Car {
- private String brand;
- private String corp;
- private Integer price;
- private Integer maxSpeed;
- public Car(String brand, String corp, Integer price) {
- this.brand = brand;
- this.corp = corp;
- this.price = price;
- }
- @Override
- public String toString() {
- return "Car{" +
- "brand='" + brand + '\'' +
- ", corp='" + corp + '\'' +
- ", price=" + price +
- ", maxSpeed=" + maxSpeed +
- '}';
- }
- }
这里故意在构造器里少放一个字段,来到配置文件
- <bean id="car" class="com.figsprite.bean.Car">
- <constructor-arg value="奥迪"></constructor-arg>
- <constructor-arg value="上海"/>
- <constructor-arg value="3000000"/>
- </bean>
在Main中输入测试代码:
- Car car = (Car)ctx.getBean("car");
- System.out.println(car.toString());

看结果,很有意思的是我已经将HelloWorld.java相关的代码注释了,可是还是出现了我们上一讲所写的注释,这就应证了之前所说的:
ApplicationContext在初始化上下文时就实例化所有单例的Bean。
接下来再配置一个构造器:
- public Car(String brand, String corp, int price, int maxSpeed) {
- this.brand = brand;
- this.corp = corp;
- this.price = price;
- this.maxSpeed = maxSpeed;
- }
来到配置文件:
- <bean id="car2" class="com.figsprite.bean.Car">
- <constructor-arg value="海南马自达"></constructor-arg>
- <constructor-arg value="上海"/>
- <constructor-arg value="3000000"/>
- <constructor-arg value="78"/>
- </bean>
- Car car2 = (Car)ctx.getBean("car2");
- System.out.println(car2.toString());
发现没什么问题,但如果构造器是品牌名、场地、最大速度,Spring能识别出来吗?
先将price改成double,否则不满足重载规则,写上新的配置文件
- <bean id="car2" class="com.figsprite.bean.Car">
- <constructor-arg value="海南马自达"></constructor-arg>
- <constructor-arg value="上海"/>
- <constructor-arg value="78"/>
- </bean>
发现并没有得到我们想要的,如何解决这个问题呢?

此时需要用到type属性,
- <bean id="car" class="com.figsprite.bean.Car">
- <constructor-arg value="奥迪" type="java.lang.String"></constructor-arg>
- <constructor-arg value="上海" type="java.lang.String"/>
- <constructor-arg value="3000000" type="double"/>
- </bean>
- <bean id="car2" class="com.figsprite.bean.Car">
- <constructor-arg value="海南马自达" type="java.lang.String"></constructor-arg>
- <constructor-arg value="上海" type="java.lang.String"/>
- <constructor-arg value="78" type="int"/>
- </bean>
嗯,是我们想要的了,使用构造器注入属性值可以指定参数的位置和参数类型,这里还有一个index的属性,用于不按构造器参数顺序写标签时使用。大家可以自行尝试一下

Spring的Bean配置的更多相关文章
- 【转】Spring学习---Bean配置的三种方式(XML、注解、Java类)介绍与对比
[原文]https://www.toutiao.com/i6594205115605844493/ Spring学习Bean配置的三种方式(XML.注解.Java类)介绍与对比 本文将详细介绍Spri ...
- spring中bean配置和bean注入
1 bean与spring容器的关系 Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载.实例化Bean ...
- spring中bean配置和注入场景分析
bean与spring容器的关系 Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载.实例化Bean,并 ...
- Spring 梳理-bean配置与装配
1 bean配置与装配 1.1 bean在XML文件中进行显示配置并装配 1.2 bean在JavaConfig中显示配置并装配 1.2.1 优点:类型是安全的,编译 ...
- 关于spring中bean配置的几件小事
一.IOC和DI 1.IOC(Inversion of Control) 其思想是反转资源获取的方向.传统的资源查找方式要求组件向容器发起请求查找资源,作为回应,容器适时的返回资源:而应用了IOC之后 ...
- 使用@Configuration注解来代替Spring的bean配置
下面是一个典型的Spring配置文件(application-config.xml): <beans> <bean id="orderService" class ...
- Spring中bean的配置
先从IOC说起,这个概念其实是从我们平常new一个对象的对立面来说的,我们平常使用对象的时候,一般都是直接使用关键字类new一个对象,那这样有什么坏处呢?其实很显然的,使用new那么就表示当前模块已经 ...
- Spring之Bean的配置方式
在博客中为了演示容器Bean实例化时暴露出的几个接口,将UserBean配置在XML中,其实常见的Bean的配置有3种.1.基于xml配置Bean 2.使用注解定义Bean 3.基于java类提供Be ...
- spring中bean的配置详解--定义parent
在工作中碰到了好多的配置文件,具体来说是spring 中bean配置的parent的配置,搞的我一头雾水,仔细看一下spring中有关bean的配置,剖析一下,具体什么含义! 一.Spring IoC ...
随机推荐
- 【CQOI2006】凸多边形
1713 -- [CQOI2006]凸多边形 Description 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. Input ...
- 设计模式のNullObjectPattern(空对象模式)----行为模式
一.产生背景 在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查.Null 对象不是检查空值,而是反应一个不做任何动作的关系.这样的 Null 对象也可 ...
- 数以亿计运行PHP的网站即将面临严重的安全风险
数以亿计运行PHP的网站即将面临严重的安全风险 根据W3Techs的统计数据,目前所有互联网站点中约有78.9%使用PHP运行.但是2018年12月31日,PHP 5.6.x的安全支持将正式停止,标志 ...
- 工具 docker
环境配置 软件+环境 虚拟机 资源占用 容器 进程隔离 image(镜像)文件 容器文件 docker hub:仓库 docker container run image_name 挂载: 参考链接 ...
- [Micropython]TPYBoardV102 DIY智能温控小风扇
1.实验目的 1. 学习在PC机系统中扩展简单I/O 接口的方法. 2. 进一步学习编制数据输出程序的设计方法. 3. 学习DS18B20的接线方法,并利用DS18B20检测当前温度. 4.学习三极管 ...
- JPA和分布式事务简介
1. Transaction 分两种,Local Transaction 和 Global Transaction. 涉及到一个Connection的Commit,称为Local Transactio ...
- Linux死锁检测-Lockdep
关键词:LockDep.spinlock.mutex. lockdep是内核提供协助发现死锁问题的功能. 本文首先介绍何为lockdep,然后如何在内核使能lockdep,并简单分析内核lockdep ...
- Linux并发与同步专题 (1)原子操作和内存屏障
关键词:. <Linux并发与同步专题 (1)原子操作和内存屏障> <Linux并发与同步专题 (2)spinlock> <Linux并发与同步专题 (3) 信号量> ...
- redis底层设计(二)——内存映射数据结构
我们继续接着上一篇博客,今天来看看内存映射数据结构. 上篇我们讲了内部数据结构,虽然内部数据结构非常强大,但是创建一系列完整的数据结构本身也是一件相当耗费时间的工作,当一个对象包含的元素数量并不多,或 ...
- Linq to XML操作XML文件
LINQ的类型 在MSDN官方文件中,LINQ分为几种类型: . LINQ to Objects(或称LINQ to Collection),这是LINQ的基本功能,针对集合对象进行查询处理,包括基本 ...