Spring 控制反转(IOC)
这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战
IOC概念
- 控制反转,把对象创建和对象间的调用过程,交给Spring进行管理。
- 使用IOC可以降低对象间的耦合度。
- IOC底层原理:XML解析,工厂模式,反射。
现在我们来讲讲 怎么使用 IOC。
一、Spring配置
详细在代码的注解里。
1、别名
1 | xml复制代码<!-- 别名(给id为user取别名),如果取了别名,我们也可以通过别名获取到这个对象--> |
2、bean的配置
Spring Ioc容器的核心就是要玩坏bean!
基本属性:
1 | xml复制代码<!-- id: bean的唯一标识符 |
scope属性(重点是singleton和prototype):
一般情况下是使用singleton,但是要整合struts2时则要在ActionBean中使用prototype。而request和session属性基本上是用不到的。
singleton(默认值):单例模式,所谓单例对象,就是在spring容器中只会存在一个的实例
prototype属性:多例原型被标记为多例的对象,每次再获得才会创建并且每次创建都是新的对象
request: web环境下,对象与request生命周期一致,也就是每当请求处理完一次,对象将从spring容器中移除
session:web环境下,对象与session生命周期一致
在下一篇博客会详细讲这个属性。
3、import
一般用于团队开发使用,可以将多个配置文件,导入合并成一个
使用的时候使用总配置文件就行
二、Spring IOC容器
SpringIOC的核心为IOC容器,它主要有两种:
BeanFactory:IOC容器的基本实现,是Spring内部的使用接口,不提供开发人员使用。加载配置文件的时候不会去创建对象,在获取对象使用才去创建对象。
ApplictionContext:BeanFactory接口的子接口,提供更多更强大的功能,一般有开发人员使用,加载配置文件时候就会创建对象。
ApplicationContext的实现有四种方式:
FileSystemXmlApplicationContext:加载配置文件的时候采用的是项目的路径。
ClassPathXmlApplicationContext:加载配置文件的时候根据ClassPath位置。(重点)
XmlWebApplicationContext:在Web环境下初始化监听器的时候会加载该类。
AnnotationConfigApplicationContext:根据注解的方式启动Spring 容器。(介绍)
1、依赖注入(DI)
- 依赖:bean对象的创建依赖于容器
- 注入:bean对象中的所有属性,由容器来注入
环境搭建
- 导入Spring相关的jar包
1 | xml复制代码<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> |
- 编写实体类
1 | java复制代码public class Hello { |
构造器注入
1.无参构造创建对象(默认)
- 编写beans.xml文件(重点),spring主要就在这个文件里进行一些列的操作
有点类似Mybatis中的Mapper.xml一样,详细的在代码中有注释
1 | xml复制代码<?xml version="1.0" encoding="UTF-8"?> |
测试类
这里使用ClassPathXmlApplicationContext 加载配置文件,也是最常用的方式。
1 | java复制代码public class MyTest { |
结果:
name=spring,就是我在bean对象的时候给name属性的value值为spring
2.有参构造创建对象
我们需要在实体类中User中添加一个有参构造的方法
1 | java复制代码public class UserT { |
编写xml配置文件
三种方式都行
- 下标赋值
1 | xml复制代码<!-- 第一种,下标赋值--> |
- 通过类型来创建
1 | xml复制代码<!--第二种,通过类型创建,不建议使用--> |
- 通过参数名
1 | xml复制代码<!-- 第三种,通过参数名--> |
测试类:
1 | java复制代码 public static void main(String[] args) { |
结果
小结:
在配置文件加载的时候,容器中管理的对象就已经被初始化了,也就是前面讲Spring配置的时候的单例模式,即对象就被创建了一个。
- User的对象是由Spring创建的
- User对象的属性是由bean的value设置
这个过程就是控制反转:
控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring IOC容器来创建和管理的.
反转:程序本身不创建对象,而变成被动的接收对象.
依赖注入:就是利用set方法来进行注入的.
IOC是一种编程思想,由主动的编程变成被动的接收.
我们彻底不用再程序中去改动代码了,要实现不同的操作,只需要在xml配置文件中进行修改,所谓的loC就是:对象由Spring来创建,管理,装配!
Set方式注入(重点)
要求被注入的属性 , 必须有set方法 , set方法的方法名由set + 属性首字母大写 ,这个例子由几乎所有属性的注入方式,有String、map、list、set、Properties、String[]、实体类(Bean的注入)对象等,如果是刚开始学的,请耐心看完beans.xml里的配置
实体类:
Address 类
1 | java复制代码public class Address { |
Student 类
1 | java复制代码public class Student { |
编写beans.xml
1 | xml复制代码<?xml version="1.0" encoding="UTF-8"?> |
测试类
1 | java复制代码 public static void main(String[] args) { |
结果:
拓展方式的注入
主要有p 命名空间的注入 和 c命名空间注入
实体类
1 | java复制代码public class User { |
1 | xml复制代码<!-- p 命名空间的注入,可以直接注入属性的值:property--> |
注意点:p命名和c命名空间不能直接使用,需要xml导入约束
1 | xml复制代码 xmlns:p="http://www.springframework.org/schema/p" |
测试结果:
p命名注入:
c命名注入:
注意:C命名空间注入 ,原理是使用构造器注入,所以必须要在实体类中加上有参构造器
海绵宝宝,今天的学习就到此为止吧,明天依旧学习噢!
本文转载自: 掘金