前排提示:
1:这篇文件是对尚硅谷的视频总结,包含老师上课的大多数源码,我是看着老师的课做的笔记
2:本套课程适合已经会用spring框架,甚至对springboot有所了解的同学学习。
点击观看Spring课程
- IOC
- IOC概念
- IOC原理
- IOC容器
- IOC容器的两种实现方式
- BeanFactory(接口)(不推荐)
- ApplicationContext(接口)(推荐)
- FileSystemXmlApplicationContext(实现类)(不推荐)
- ClassPathXmlApplicationContext(实现类)(推荐)
- 入门案例
- IOC容器的两种实现方式
- Bean的管理
- 基于xml配置文件方式管理
- 基于xml方式创建对象
- 基于xml方式注入属性(DI依赖注入)
- 通过set方法注入
- 通过构造器(有参构造方法)注入
- 对于两种注入方式的扩充
- 注入外部bean
- 注入内部bean
- 数组类型属性注入
- List集合类型属性注入
- Map集合类型属性注入
- Set集合类型属性注入
- 基于注解方式管理
- 基于xml配置文件方式管理
IOC概念
1:控制反转,把对象的创建和对象之间的调用过程,交给IOC容器(Spring容器)进行管理
2:使用IOC的目的:降低类与类之间的耦合度
IOC原理
xml解析,工厂模式,反射
IOC容器
IOC思想基于IOC容器完成,IOC容器的底层就是对象工厂
IOC容器的两种实现方式
IOC容器的两种实现方式分别为BeanFactory,ApplicationContext,二者都是接口
BeanFactory
BeanFactory:是IOC容器的基本实现,是Spring内部的使用接口,一般不建议实际开发人员使用。在加载xml配置文件的时候不会创建对象,在获取(使用)对象的时候才会去创建。
ApplicationContext
ApplicationContext:是BeanFactory接口的子接口,提供更多更强大的功能,建议开发人员使用。在加载配置文件的时候就会把配置文件中定义的Bean对象创建出来。 相较于BeanFactory的IOC容器实现方式,基于ApplicationContext的容器实现方式在实际的web服务当中,他的运行效率更快,因为在服务器启动的时候,已将所有定义在配置文件中的Bean对象全部都创建出来了。这样当代码在运行到某一个环节时,需要用到每一个Bean对象,就不需要花时间当场去创建了。
FileSystemXmlApplicationContext(实现类)
使用FileSystemXmlApplicationContext进行容器初始化时,需要在他的构造方法中传递一个参数,这个参数就是我们配置文件所在的绝对路径。这会导致一个可移植性差的问题。因为每个人存放代码的位置不一样。而使用ClassPathXmlApplicationContext为容器初始化就避免了这个问题。
ClassPathXmlApplicationContext(实现类)
ClassPathXmlApplicationContext进行容器初始化,和前者一样,同样需要在他的构造方法中传递一个参数,这个参数就是我们配置文件所在的相对路径。这样就有效的避免了移植性差的问题。
入门案例
1:打开IDEA工具创建一个maven工程
2:pom文件添加依赖
org.springframework spring-context5.2.6.RELEASE junit junit4.12 test
3:定义一个类
package com.atguigu.gk.service; public class Carservice { int a; String b; public Carservice() { } public Carservice(int a, String b) { this.a = a; this.b = b; } public void setA(int a) { this.a = a; } public void setB(String b) { this.b = b; } public int getA() { return a; } public String getB() { return b; } @Override public String toString() { return "Carservice{" + "a=" + a + ", b='" + b + ''' + '}'; } }
4:在resource资源目录下创建配置文件
5:在配置文件内添加要交给IOC容器(Spring容器)进行管理的Bean
6:创建测试类
package com.atguigu.gk.service; import org.junit.Test; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; public class TestSpring5 { @Test public void f(){ //1.实例化IOC容器并加载spring配置文件 BeanFactory context = new ClassPathXmlApplicationContext("a.xml"); //2.获取Bean对象 Carservice carService = context.getBean("carService", Carservice.class); System.out.println(carService); } @Test public void f2(){ //1.实例化IOC容器并加载spring配置文件 ApplicationContext context = new FileSystemXmlApplicationContext("I:\spring学习\src\main\resources\a.xml"); //2.获取Bean对象 Carservice carService = context.getBean("carService", Carservice.class); System.out.println(carService); } @Test public void f3(){ //1.实例化IOC容器并加载spring配置文件 ApplicationContext context = new ClassPathXmlApplicationContext("a.xml"); //2.获取Bean对象 Carservice carService = (Carservice) context.getBean("carService"); System.out.println(carService); } }
Bean的管理
IOC容器对bean进行管理包括:
1:创建bean对象(入门案例已经体现)
2:为bean的属性赋值(DI依赖注入)
基于xml方式创建对象
注意:IOC容器通过配置文件创建对象的时候会调用无参构造,如果类在定义的时候没有无参构造会报错。
所以当你自定义了有参构造后,一定要记得定义无参构造
基于xml方式注入属性
通过set方法注入
通过有参构造器(有参构造方法)注入
通过有参构造器注入属性会先调用有参构造器创建bean对象
package com.atguigu.gk; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Set; public class Stu { //1 数组类型属性 private String[] courses; //2 list集合类型属性 private List list; //3 map集合类型属性 private Map maps; //4 set集合类型属性 private Set sets; public void setCourses(String[] courses) { this.courses = courses; } public void setList(List list) { this.list = list; } public void setMaps(Map maps) { this.maps = maps; } public void setSets(Set sets) { this.sets = sets; } @Override public String toString() { return "Stu{" + "courses=" + Arrays.toString(courses) + ", list=" + list + ", maps=" + maps + ", sets=" + sets + '}'; } }
2:创建xml文件
C++ Java
张三 李四 1 2
3:创建测试类(测试)
package com.atguigu.gk.service; import com.atguigu.gk.Stu; import com.atguigu.gk.controller.AController; import org.junit.Test; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; public class TestSpring5 { @Test public void f5(){ //1.实例化IOC容器并加载spring配置文件 ApplicationContext context = new ClassPathXmlApplicationContext("a.xml"); //2.获取Bean对象 Stu stu = context.getBean("stu", Stu.class); System.out.println(stu); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)