概念
- 概念:IoC即控制反转,将创建对象和对象之间的调用过程由原本的new关键字转交给Spring框架管理,程序自身不必去创建对象
- 目的:降低耦合度,在Web开发中的主要用途就是将Bean类的管理交由Spring而非程序员手动管理
- 特征:创建对象使用工厂模式创建,而非程序员直接new
- 原理:xml解析、工厂模式、反射
- 工厂模式只能将耦合降低,并不能将耦合度降成最低,所以加上xml解析和反射,将耦合度进一步降低
IoC过程
- 创建xml文件,配置bean对象
- 第二步:创建工厂类,在工厂方法中进行xml解析,并通过反射得到类的字节码,Class.forName()
- 第三步:对象创建,class.newInstance()
接口(IoC)
- IoC思想基于IOC容器完成,IOC容器底层就是对象工程
- Spring提供了IOC容器的两种实现方式(两个接口):
- BeanFactory(基本实现,是spring内部的使用,一般开发人员不用)
加载配置文件时不会创建对象,在获取对象是才去创建对象 - ApplicationContext(是BeanFactory的子接口,提供更多功能,一般由开发人员使用)
在加载配置文件时就完成对象创建
ApplicationContext有两个实现类:FileSystemXmlApplicationContext和ClassPathXmlApplicationContext
- BeanFactory(基本实现,是spring内部的使用,一般开发人员不用)
Bean管理操作
-
操作步骤
- Spring创建对象操作:工厂方法创建对象
- Spring属性注入操作:创建对象的过程中为各个属性赋值
-
Bean管理操作的两种方法
-
基于xml
- 创建对象:在spring文件中使用bean>标签,添加对应属性,即可实现对象创建
- id属性:给对象起一个标识名
- class属性:类的全路径
- 创建对象,默认使用的是无参构造方法,如果没有无参构造,会报错
- 依赖注入(DI)
- 概念:依赖注入,就是注入属性
- 第一种方式:使用set方法
创建属性
创建对应set方法
注入属性,在bean>标签中使用property>标签,name为属性名,value为想要注入的值 - 第二种方法:使用有参构造注入
创建属性
创建有参构造方法
在spring的配置文件中进行配置,在bean>标签中使用多个consturctor-org>标签,name为属性名,value为属性值,也可以使用index来作为第几个参数值替代name - p名称空间注入,底层还是依赖set方法注入
- 注入null值和特殊字符
- 字面量:固定值,如字符串等
- null:property>中不用写value值,而是在property>两个标签中添加一个null/>标签
- 特殊字符:如>,""等,两种方式
- 转义: “<”;">"
- 内容写道CDATA中:value>标签中添加一个标签![CDATA[value]]>,字符写在value中,就可以包含特殊符号
- 字面量:固定值,如字符串等
- 外部bean赋值
在service层中调用dao中的方法,就是调用外部bean- 创建service和dao
- 在service中调用dao的方法
- 在spring配置文件中进行配置,在service中注入dao
- 创建两个bean,一个为service,一个为dao的实现,在service中使用property标签,用ref属性,将dao注入service
- 内部bean赋值
- 内部bean:实体类里面有实体类
- 先设置普通属性
- 然后设置对象类型属性 在property中创建bean对象,成为内部bean(称为级联赋值)
- 内部bean:实体类里面有实体类
- 级联赋值的其他方法
- 内部类的bean写在和外部bean同一层,然后在外部bean中使用ref标签来引用内部类,类似于外部bean赋值
- 注入集合类型
- 注入数组,list值
添加bean标签,然后在property标签中使用list或者array标签等,在array标签中使用多个value标签进行注入 - 注入map
map标签使用的是entry - 注入set
set标签用的是value
- 注入数组,list值
- 集合中注入对象属性值
- 法一:先创建多个实体对象bean,然后在list标签中使用ref标签逐个引入实体对象id
- 法尔:使用util标签,在其中使用value标签来赋多值,然后在bean标签中使用ref引入id
- 工厂Bean:普通Bean返回的对象就是定义的类型,工厂bean则返回的类型不一定与定义类型相同
- 将Bean类实现FactoryBean接口,设置泛型<>为返回类型,在getObject方法里创建对象
- Bean的作用域
- 在Spring中,设置bean实例是为单实例还是多实例,在默认情况下创建的为单例
- 设置多实例的方法:在备案标签中使用scope属性来更改,singleton标识单例,prototype为多实例,singleton为加载时创建,prototype为调用getBean方法时创建
- Bean的生命周期
从对象创建到对象销毁的过程- 通过构造器创建实例(调用构造方法)
- 为Bean注入值(调用set方法)
- 调用Bean里面的初始化方法(执行初始化方法,在bean标签中使用init-Method属性绑定方法)
- Bean已经可以使用
- 容器关闭时,调用bean的销毁方法销毁Bean(执行销毁方法,在bean标签中使用destroy方法进行绑定)
- 自动装配
以上注入值的方法都是手动装配,而自动装配可以指定一个规则,Spring自动匹配属性值进行注入- 在bean标签中使用autowire属性,值为byname和bytype
- 创建对象:在spring文件中使用bean>标签,添加对应属性,即可实现对象创建
-
基于注解
-