Spring(2)——配置Bean的几种方式 - Go语言中文社区

Spring(2)——配置Bean的几种方式


什么是 IOC

Ioc- Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。

  • 谁控制谁,控制什么:

    • 传统的Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建以来对象;而Ioc是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;**谁控制了谁?**当然是Ioc容器控制了对象;**控制什么?**主要控制外部资源获取
  • 为何是反转,哪些方面反转了:

    • 有反转就有正传,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接收依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

图一:传统应用程序示意图

在这里插入图片描述

当有了Ioc/DI的容器后,在客户端类中就不再主动去创建这些对象了。
图二:有Ioc/DI容器后程序结构示意图

在这里插入图片描述

DI

DI- Dependency Injection,即“依赖注入”:是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并未系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关系具体的资源来自何处,由谁实现。

Ioc与DI的关系

他们是同一个概念的不同角度描述,由于控制反转概念比较含糊,所以在2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对于Ioc而言,“依赖注入”明确描述了“被注入对象依赖Ioc容器配置依赖对象”。

Spring容器

在Spring IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化。只有在容器实例化后,才可以从IOC容器里获取Bean实例并使用。

Spring提供了两种类型的IOC容器实现

  • BeanFactory:IOC容器的基本实现
  • ApplicationContext:提供了更多的高级特性。是BeanFactory的子接口。
  • BeanFactory是Spring框架的基础设施,面向Spring本身;ApplicationContext面向使用Spring框架的开发者,几乎所有的应用场合都直接使用ApplicationContext而非底层的BeanFactory
  • 无论以哪种方式实现IOC容器,配置文件是相同的。

在这里插入图片描述

  • ApplicationContext的主要实现类

    • ClassPathXMLApplication:从类路径下加载配置文件
    • FileSystemXMLApplicationContext:从文件系统中加载配置文件
  • ConfigurableApplicationContext:扩展于ApplicationContext,新增加两个主要方法:refresh()和close()方法,让ApplicationContext具有启动、刷新和关闭上下文的能力。

  • ApplicationContext在初始化上下文时就实例化所有单例的Bean

配置Bean

  • 配置形式:基于XML文件的方式;基于注解的方式

  • Bean的配置方式:

    • 通过全类名(反射)
    • 通过工厂方法
    • FactoryBean
  • Ioc容器:BeanFactory;ApplicationContext

  • 依赖注入的方式:

    • 属性注入;
    • 构造器注入;
    • 工厂方法注入(很少使用,不推荐使用)

在Spring IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化。只有在容器实例化之后,才可以从IOC容器里获取Bean实例并使用
Spring提供了两种类型的IOC容器实现。

  • BeanFactory: IOC容器的基本实现(2种)
  • ApplicationContext:提供了更多的高级特性,是BeanFactory的子接口
  • BeanFactory是Spring框架的基础设施,面向Spring本身;ApplicationContext面向使用Spring框架的开发者,几乎所有的应用场合都直接使用ApplicationContext而非底层的BeanFactory
  • 无论使用何种IOC容器,配置文件是相同的

无Spring与有Spring对比

在这里插入图片描述

在没有Spring的时候需要先获取A对象,然后获取B对象,再将A放进B中
有Spring之后,只需要直接获取B对象就可以了,Spring会自动将A对象放入B中

配置Bean的方式

1. 通过全类名(反射)的方式

全类名的方式如下:
class节点对应的值是想要反射的类的全路径:包名+类名
在这里插入图片描述

如果Class对应的类中没有无参构造器,就会报错,错误如下

在这里插入图片描述

获取Bean方式一:就是通过xml中的id来获取对应的bean。
在这里插入图片描述
获取Bean方式二:就是通过类型返回IOC容器中的bean,但要求IOC容器中必须只能有一个该类型的Bean。

ApplicationContext在初始化上下文的时候就实例化所有单例的bean

依赖注入的方式

1. 属性注入 setter()

  • 属性注入即通过setter()注入Bean的属性值或依赖的对象
  • 属性注入使用<property>元素,使用那么属性指定Bean的属性名称,value属性或<value>子节点指定属性值

下面是通过setter()注入Bean的属性值
在这里插入图片描述

2. 构造器注入Bean的属性值

  • 下面通过构造方法注入Bean的属性值或依赖对象,它保证了Bean实例在实例化后就可以使用。
  • 构造器注入在<constructor-arg>元素里声明属性,<constructor-arg>中没有name属性

在这里插入图片描述

xml文件

在这里插入图片描述

上面的程序输出的结果为:

在这里插入图片描述

但是如果类中重载了很多构造器那怎么办呢?
使用构造器注入属性值可以指定参数的位置和参数的类型!用以区分重载的构造器!!!通过type来指定

在这里插入图片描述

在这里插入图片描述

从上面可以看出,如果不写type。那么会自动匹配类中写在前面的构造器。

  • 字面值:
    • 可用字符串表示的值,可以通过<value>子节点进行注入
    • 基本数据类型及其封装类、String等类型都可以采取字面值注入的方式
    • 若字面值中包含特殊字符,可以使用<![CDATA[]]>把字面值包裹起来

在这里插入图片描述

在这里插入图片描述

3. 注入对象类型的属性(注入依赖类的对象)

方式一:直接使用property的ref

在这里插入图片描述

方式二:使用内部bean,在property中写一个内部bean

在这里插入图片描述

为级联属性赋值。

在这里插入图片描述

当为级联属性赋值的时候注意一定要先初始化级联的对象。

4. 注入集合list属性

在这里插入图片描述

注意cars类型是List类型

在这里插入图片描述

5. 注入集合Map属性

在这里插入图片描述

使用map结点及mao的entry子节点配置Map类型的成员变量
在这里插入图片描述

6. 注入Properties对象

在这里插入图片描述

在这里插入图片描述

7. p命名空间注入

首先要引入p的名称空间,在beans中加入下方框住的这句话:

xmlns:p="http://www.springframework.org/schema/p"

在这里插入图片描述

在这里插入图片描述

8. 将集合单独拿出来,以供多个bean进行引用(使用util)

首先需要引入util的命名空间,主要包含以下三句话

<beans xmlns = "http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/util 
	http://www.springframework.org/schema/util/spring-util-4.1.xsd
	">

在这里插入图片描述

在这里插入图片描述

总结

一:Spring获取bean的步骤:

  1. 首先创建ApplicationContext的IOC容器对象
  2. 从IOC容器中获取Bean实例(2种方式,xml的id和类名.class)

二:Bean的注入方式

  1. 使用setter方法进行属性注入 <property name="属性名" value="属性值” />
  2. 使用构造器
    <contructor-arg value="属性值">
  3. 注入对象类型的属性4. 注入对象类型的属性
    (1) 方式一:用<property name="car" ref ="car1" />
    (2)方式二:在property结点中自己写一个内部bean
  4. list集合属性
    在property中多加了list结点
  5. map集合属性
    使用map结点及map的entry子节点来配置键值对
  6. 注入Properties对象(其实Properties是Map的子类)
    使用property的props子节点 prop来为属性赋值
  7. 将集合单独拿出来,以供多个bean进行引用
    需要导入util命名空间
  8. p命名空间注入

参考并感谢

http://jinnianshilongnian.iteye.com/blog/1413846

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/xiaojie_570/article/details/82877445
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 15:16:15
  • 阅读 ( 1090 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢