美文网首页
Spring之IoC容器

Spring之IoC容器

作者: 紫荆秋雪_文 | 来源:发表于2019-09-29 00:06 被阅读0次

    一、IoC容器

    1、BeanFactory

    BeanFactory是Spring中最底层的接口,只提供了最简单的IoC功能,负责配置、创建和管理bean。在应用中,一般不使用BeanFactory,而推荐使用ApplicationContext(应用上下文)

    2、BeanFactory和ApplicationContext的区别

    2.1:ApplicationContext继承了BeanFactory,拥有了基本的IoC功能

    2.2:除此之外,ApplicationContext还提供了以下的功能

    ①、支持国际化
    ②、支持消息机制
    ③、支持统一的资源加载
    ④、支持AOP功能

    2.3:ApplicationContext常见实现类

    • 2.3.1:ClassPathXmlApplicationContext:读取classpath中的资源
    ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    
    • 2.3.2:FileSystemXmlApplicationContext:读取指定路径的资源
    ApplicationContext ac = new FileSystemXmlApplicationContext("c:/applicationContext.xml");
    
    • 2.3.3:XmlWebApplicationContext:需要在Web的环境下才可以运行
    XmlWebApplicationContext ac = new XmlWebApplicationContext(); // 这时并没有初始化容器
    ac.setServletContext(servletContext); // 需要指定ServletContext对象
    ac.setConfigLocation("/WEB-INF/applicationContext.xml"); // 指定配置文件路径,开头的斜线表示Web应用的根目录
    

    二、Bean的创建时间

    1:ApplicationContext在加载的时候就会创建所有bean(Web应用推荐)

    2:BeanFactory需要等到拿bean的时候才会创建bean

    三、Bean的实例化方式

    方式一:构造器实例化(无参数构造器),最标准,使用最多

    • Bean1
    package com.revanwang.bean;
    
    public class Bean1 {
    
    }
    
    • bean1.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="b1" class="com.revanwang.bean.Bean1"/>
    
    </beans>
    

    方法二:静态工厂方法实例化:解决系统遗留问题

    • Bean2
    package com.revanwang.bean2;
    
    public class Bean2 {
    
        public void bean2() {
            System.out.println("....Bean2....");
        }
    
    }
    
    
    • Bean2Factory
    package com.revanwang.bean2;
    
    public class Bean2Factory {
    
        public static Bean2 getBean2() {
            return new Bean2();
        }
    }
    
    • bean2.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="bean2" class="com.revanwang.bean2.Bean2Factory" factory-method="getBean2"/>
    
    </beans>
    

    方法三:实现工厂实例化

    • Bean3
    package com.revanwang.bean3;
    
    public class Bean3 {
        public void bean3() {
            System.out.println("。。。Bean3。。。");
        }
    }
    
    • Bean3Factory
    package com.revanwang.bean3;
    
    
    public class Bean3Factory {
    
        public Bean3 getBean3() {
            return new Bean3();
        }
    
    }
    
    • bean3.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="bean3Factory" class="com.revanwang.bean3.Bean3Factory"/>
        <bean id="bean3" class="com.revanwang.bean3.Bean3"/>
    
    </beans>
    

    方法四:实现FactoryBean接口实例化

    • Bean4
    package com.revanwang.bean4;
    
    public class Bean4 {
        public void bean4() {
            System.out.println("。。。Bean4。。。");
        }
    }
    
    • Bean4Factory
    package com.revanwang.bean4;
    
    import org.springframework.beans.factory.FactoryBean;
    
    public class Bean4Factory implements FactoryBean<Bean4> {
    
        @Override
        public Bean4 getObject() throws Exception {
            return new Bean4();
        }
    
        @Override
        public Class<?> getObjectType() {
            return Bean4.class;
        }
    
        @Override
        public boolean isSingleton() {
            return true;
        }
    }
    
    
    • bean4.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="bean4" class="com.revanwang.bean4.Bean4Factory"/>
    
    </beans>
    

    四、Bean的作用域

    singleton: 单例 ,在Spring IoC容器中仅存在一个Bean实例 (默认的scope)

    prototype: 多例 ,每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时 ,相当于执行new XxxBean():不会在容器启动时创建对象

    request: 用于web开发,将Bean放入request范围 ,request.setAttribute("xxx") , 在同一个request 获得同一个Bean

    session: 用于web开发,将Bean 放入Session范围,在同一个Session 获得同一个Bean

    globalSession: 一般用于Porlet应用环境 , 分布式系统存在全局session概念(单点登录),如果不是porlet环境,globalSession 等同于Session

    注意:在开发中主要使用 scope="singleton"、 scope="prototype" 对于MVC中的Action/Controller使用prototype类型,其他使用singleton

    bean作用域.png

    五、初始化和销毁方法

    比如DataSource,SessionFactory最终都需要关闭资源:在Bean销毁之前,都要调用close方法.

    <bean id="someBean" class="......" 
    init-method="该类中初始化方法名" destroy-method="该类中销毁方法名">
    </bean>
    init-method:bean生命周期初始化方法,对象创建后就进行调用
    destroy-method:容器被销毁的时候,如果bean被容器管理,会调用该方法。
    default-init-method
    

    分析原理:

    • 如果bean的scope="prototype",那么容器只负责创建和初始化,它并不会被spring容器管理。交给用户自己调用.

    相关文章

      网友评论

          本文标题:Spring之IoC容器

          本文链接:https://www.haomeiwen.com/subject/zvxuuctx.html