了解spring中的ioc

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zmh458/article/details/89044040

前言

我们都知道spring框架的核心是ioc和aop,今天我们大概了解一下ioc.对ioc有一个宏观的了解.


叙述

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。

是什么

控制反转(IoC,Inversion of Control),是一种思想。指的是将创建对象的操作权交给容器(例如spring),通过容器来装配和管理对象的创建,控制反转其实就是对这些对象控制权的反转,控制权由程序本身反转给了外部容器。

IOC的传值方式有哪些?

一般的是设值传入和构造方法传入。

如何实现?

1. ioc是一种思想,有一些实现方式,其中较为常用的一种是依赖注入(Dependency Injection,简称DI),依赖注入是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。
依赖注入让 Spring 的Bean之间以配置文件的方式组织在一起,而不是以硬编码的方式耦合在一起。
2.ioc的另外一个实现方式就是依赖查找,(Dependency Lookup,DL)

依赖注入

组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。容器全权负责的组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造函数传递给需要的对象。通过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);将依赖关系作为构造函数参数传入的做法称为构造器注入(Constructor Injection)
IOC的容器:

  • ApplicationContext接口

       通过ApplicationContext接口获取到spring注入给程序的对象,这里ApplicationContext充当了spring IOC容器的角色,ApplicationContext使用了反射的方式创建bean对象,并且在读取配置文件之后将里面注册的bean全部创建对象。我们可以通过该接口的两个实现类来创建容器:

    • ClassPathXmlApplicationContext
      如果spring的配置文件在项目的类路径下,可以使用该类创建容器
    • FileSystemXmlApplicationContext
      如果spring的配置文件不在类路径下,可以使用该来创建容器
@Test
public void newType(){
    //读取spring配置文件
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    StudentService studentService = (StudentService) context.getBean("studentService");
    studentService.study();
}
  • BeanFactory接口

我们还可以使用BeanFactory接口充当spring IOC容器的角色,BeanFactory是ApplicationContext的父接口。与ApplicationContext不同的是BeanFactory在读取配置文件之后不会创建里面bean的对象,而是在使用的时候才会创建。

@Test
public void beanFactory(){
    //该方式已经被废弃
    //BeanFactory xmlBeanDefinitionReader = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));

    DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
    XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
    reader.loadBeanDefinitions(new FileSystemResource("H:\\DailyExercise\\springcode\\01_firstspring\\src\\main\\resources\\applicationContext.xml"));
    //当用该bena的时候才会创建对象
    StudentService studentService = (StudentService) factory.getBean("studentService");
    studentService.study();
}
  • 用ApplicationContext还是BeanFactory?

ApplicationContext提供了比BeanFactory更多的功能,在实际工作中除非特殊情况,例如你需要在一些小内存或者资源受限的机器运行程序,这个时候可以选择使用BeanFactory,此时事务的管理、AOP功能将会失效。因此,大部分情况下,建议使用ApplicationContext作为容器。

依赖查找

容器提供回调接口和上下文条件给组件。EJB和Apache Avalon 都使用这种方式。这样一来,组件就必须使用容器提供的API来查找资源和协作对象,仅有的控制反转只体现在那些回调方法上(也就是上面所说的 类型1):容器将调用这些回调方法,从而让应用代码获得相关资源。


小结

简单的了解了一下ioc是什么以及如何实现,欢迎大家随时交流哦.

感谢您的阅读~~

猜你喜欢

转载自blog.csdn.net/zmh458/article/details/89044040