SpringIOC理解

SpringIOC理解,第1张

SpringIOC理解

前排提示:
1:这篇文件是对尚硅谷的视频总结,包含老师上课的大多数源码,我是看着老师的课做的笔记
2:本套课程适合已经会用spring框架,甚至对springboot有所了解的同学学习。



点击观看Spring课程

  • IOC
    • IOC概念
    • IOC原理
    • IOC容器
      • IOC容器的两种实现方式
        • BeanFactory(接口)(不推荐)
        • ApplicationContext(接口)(推荐)
          • FileSystemXmlApplicationContext(实现类)(不推荐)
          • ClassPathXmlApplicationContext(实现类)(推荐)
      • 入门案例
    • Bean的管理
      • 基于xml配置文件方式管理
        • 基于xml方式创建对象
        • 基于xml方式注入属性(DI依赖注入)
          • 通过set方法注入
          • 通过构造器(有参构造方法)注入
            • 对于两种注入方式的扩充
            • 注入外部bean
            • 注入内部bean
            • 数组类型属性注入
            • List集合类型属性注入
            • Map集合类型属性注入
            • Set集合类型属性注入
      • 基于注解方式管理

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-context
            5.2.6.RELEASE
        
        
        
        
            junit
            junit
            4.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);
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5562844.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存