博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring-IOC的学习
阅读量:4160 次
发布时间:2019-05-26

本文共 2946 字,大约阅读时间需要 9 分钟。

一.IOC的概念

IOC 即 Inversion of Control 控制反转  通俗店就是 把创建对象的权利交给Spring容器,原先是我们主动创建一个对象,现在则是把创建对象的权利交给IOC容器,需要的时候,向spring容器要就行了。

IOC容器的作用:完成了完成对象的创建和依赖的管理注入等等。

 原先我们需要使用的Bean,交给了ioc容器管理,ioc容器里面存放了bean对象,那么 ioc容器需要创建什么样的bean对象?需要配置文件来表明创建的对象与对象的关系。xml properties文件可以用来描述这种关系。这样,我们创建一个spring ioc 容器,然后再创建一个对象读取ioc容器创建的bean对象与对象关系的配置文件,读取文件信息,这样就可以把bean的创建交给ioc容器了。

二、IOC容器结构

(1)BeanFactory

      BeanFactory也就是Ioc容器,典型的工厂模式,在Spring里面有很多的IOC容器的实现,关系如下:

BeanFactory是最基本的IOC容器的接口,代码如下:

public interface BeanFactory {        //对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象,            //如果需要得到工厂本身,需要转义                   String FACTORY_BEAN_PREFIX = "&";        //根据bean的名字,获取在IOC容器中得到bean实例            Object getBean(String name) throws BeansException;        //根据bean的名字和Class类型来得到bean实例,增加了类型安全验证机制。            Object getBean(String name, Class requiredType) throws BeansException;        //提供对bean的检索,看看是否在IOC容器有这个名字的bean            boolean containsBean(String name);        //根据bean名字得到bean实例,并同时判断这个bean是不是单例            boolean isSingleton(String name) throws NoSuchBeanDefinitionException;        //得到bean实例的Class类型            Class getType(String name) throws NoSuchBeanDefinitionException;        //得到bean的别名,如果根据别名检索,那么其原名也会被检索出来            String[] getAliases(String name);    }

(2)BeanDefinition

Definition 定义的意思,用来描述Bean的。

三、IOC容器的初始化

    IOC容器的初始化,分为三步  BeanDefinition的Resource定位、载入以及注册。

      以XmlBeanFactory举例如下:

     

/** * @author: sunzhitao * @date: 2018/7/15 11:55 * @description: 使用XmlBeanFactory 演示ioc容器的初始化流程 */public class XmlBeanFactoryDemo {    public static void main(String[] args) {        /**         *  IoC容器的初始化包括BeanDefinition的Resource定位、载入和注册这三个基本的过程。         */        //1.Resource定位:根据xml配置文件创建Resource对象,该对象中包含了BeanDefinition的信息        ClassPathResource resource = new ClassPathResource("applicationContext.xml");        //DefaultListableBeanFactory        DefaultListableBeanFactory factory = new DefaultListableBeanFactory();        //创建XmlBeanDefinitionReader读取器,用于载入beandefinition。        // 传入BeanFactory,是因为需要将读取的信息回调配置给factory        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);        //2,Resource的载入:XmlBeanDefinitionReader执行载入BeabDefinition的方法,        // 最后会完成Bean的载入和注册。        // 完成之后,Bean就会放入IOC容器中,需要的时候,就可以从容器中取出        reader.loadBeanDefinitions(resource);        //获取ioc容器里面的bean        MyService service = factory.getBean(MyService.class);        System.out.println("service = " + service);        System.out.println("person = " + service.addPerson());    }}

其中,配置文件applicationContext.xml中,bean定义如下:

被Spring IOC容器管理的bean为 MyService,代码如下:

/** * @author: sunzhitao * @date: 2018/7/15 15:17 * @description: */public class MyService {    public Person  addPerson(){        Person person = new Person();        person.setAge(18);        person.setName("miaomiao");        person.setSex("girl");        return  person;    }}

打印的结果如下:

 

很明显,我们通过getBean方法获得了ioc容器中的myService对象,并且能够正常使用其中的方法。

    

 

你可能感兴趣的文章
hbase shell出现ERROR: org.apache.hadoop.hbase.ipc.ServerNotRunningYetException
查看>>
让代码变得更优雅-Lombok
查看>>
解决Rhythmbox乱码
查看>>
豆瓣爱问共享资料插件发布啦
查看>>
Ubuntu10.10 CAJView安装 读取nh\kdh\caj文件 成功
查看>>
kermit的安装和配置
查看>>
vim 配置
查看>>
openocd zylin
查看>>
进程创建时文件系统处理
查看>>
进程创建时信号处理函数处理
查看>>
进程创建时信号处理
查看>>
进程创建时内存描述符处理
查看>>
进程创建时命名空间处理
查看>>
进程创建时IO处理
查看>>
进程创建时线程栈处理
查看>>
进程创建时pid分配
查看>>
进程创建时安全计算处理
查看>>
进程创建时cgroup处理
查看>>
idle进程创建
查看>>
内核线程创建
查看>>