Spring ioc基础内容

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring ioc基础内容相关的知识,希望对你有一定的参考价值。

1 BeanFactory与ApplicationContext区别

技术图片

BeanFactory是Spring框架中IoC容器的顶层接?,它只是?来定义?些基础功能,定义?些基础规范,?ApplicationContext是它的?个?接?,所以ApplicationContext是具备BeanFactory提供的全部功能的。
通常,我们称BeanFactory为SpringIOC的基础容器,ApplicationContext是容器的?级接?,?BeanFactory要拥有更多的功能,?如说国际化?持和资源访问(xml,java配置类)等等

技术图片

        启动 IoC 容器的?式:

        * Java环境下启动IoC容器
            ①ClassPathXmlApplicationContext:从类的根路径下加载配置?件(推荐使?)
            ②FileSystemXmlApplicationContext:从磁盘路径上加载配置?件
            ③AnnotationConfigApplicationContext:纯注解模式下启动Spring容器

        * Web环境下启动IoC容器
            ①从xml启动容器
                                <!DOCTYPE web-app PUBLIC
                        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
                        "http://java.sun.com/dtd/web-app_2_3.dtd" >
                        <web-app>
                        <display-name>Archetype Created Web Application</display-name>
                        <!--配置Spring ioc容器的配置?件-->
                        <context-param>
                        <param-name>contextConfigLocation</param-name>
                        <param-value>classpath:applicationContext.xml</param-value>
                        </context-param>
                        <!--使?监听器启动Spring的IOC容器-->
                        <listener>
                        <listener-
                        class>org.springframework.web.context.ContextLoaderListener</listener-
                        class>
                        </listener>
                        </web-app>

                ②从配置类启动容器
                                             <!DOCTYPE web-app PUBLIC
                        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
                        "http://java.sun.com/dtd/web-app_2_3.dtd" >
                        <web-app>
                        <display-name>Archetype Created Web Application</display-name>
                        <!--告诉ContextloaderListener知道我们使?注解的?式启动ioc容器-->
                        <context-param>
                        <param-name>contextClass</param-name>
                        <param-
                        value>org.springframework.web.context.support.AnnotationConfigWebAppli
                        cationContext</param-value>
                        </context-param>
                        <!--配置启动类的全限定类名-->
                        <context-param>
                        <param-name>contextConfigLocation</param-name>
                        <param-value>com.lagou.edu.SpringConfig</param-value>
                        </context-param>
                        <!--使?监听器启动Spring的IOC容器-->
                        <listener>
                        <listener-
                        class>org.springframework.web.context.ContextLoaderListener</listener-
                        class>
                        </listener>
                        </web-app>

2 纯xml模式
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
https://www.springframework.org/schema/beans/spring-beans.xsd">;

            实例化Bean的三种?式
            ?式?:使??参构造函数
            在默认情况下,它会通过反射调??参构造函数来创建对象。如果类中没有?参构造函数,将创建失败。

            ?式?:使?静态?法创建
            在实际开发中,我们使?的对象有些时候并不是直接通过构造函数就可以创建出来的,它可能在创建的过程 中会做很多额外的操作。此时会提供?个创建对象的?法,恰好这个?法是static修饰的?法,即是此种情 况。
            例如,我们在做Jdbc操作时,会?到java.sql.Connection接?的实现类,如果是mysql数据库,那么?的就 是JDBC4Connection,但是我们不会去写 JDBC4Connection connection = new JDBC4Connection() ,因 为我们要注册驱动,还要提供URL和凭证信息,? DriverManager.getConnection ?法来获取连接。

           ?式三:使?实例化?法创建
此种?式和上?静态?法创建其实类似,区别是?于获取对象的?法不再是static修饰的了,?是类中的? 个普通?法。此种?式?静态?法创建的使??率要??些。
在早期开发的项?中,??类中的?法有可能是静态的,也有可能是?静态?法,当是?静态?法时,即可 采?下?的配置?式:
            <!--使?实例?法创建对象的配置?式-->
        <bean id="beanFactory"
        class="com.lagou.factory.instancemethod.BeanFactory"></bean>
        <bean id="transferService" factory-bean="beanFactory" factory-
        method="getTransferService"></bean>

3.Bean的X及?命周期
作?范围的改变
在spring框架管理Bean对象的创建时,Bean对象默认都是单例的,但是它?持配置的?式改
变作?范围。作?范围官?提供的说明如下图:

技术图片

    在上图中提供的这些选项中,我们实际开发中?到最多的作?范围就是singleton(单例模式)和prototype(原型模式,也叫多例模式)。配置?式参考下?的代码:
        <!--使?静态?法创建对象的配置?式-->
        <bean id="userService" class="com.lagou.factory.BeanFactory"
        factory-method="getTransferService"></bean>
        <!--使?实例?法创建对象的配置?式-->
        <bean id="beanFactory"
        class="com.lagou.factory.instancemethod.BeanFactory"></bean>
        <bean id="transferService" factory-bean="beanFactory" factory-
        method="getTransferService"></bean>
        <!--配置service对象-->
        <bean id="transferService"
        class="com.lagou.service.impl.TransferServiceImpl" scope="singleton">
        </bean>

不同作?范围的?命周期
单例模式:singleton
对象出?:当创建容器时,对象就被创建了。
对象活着:只要容器在,对象?直活着。
对象死亡:当销毁容器时,对象就被销毁了。
?句话总结:单例模式的bean对象?命周期与容器相同。
多例模式:prototype
对象出?:当使?对象时,创建新的对象实例。
对象活着:只要对象在使?中,就?直活着。
对象死亡:当对象?时间不?时,被java的垃圾回收器回收了。
?句话总结:多例模式的bean对象,spring框架只负责创建,不负责销毁。

Bean标签属性
在基于xml的IoC配置中,bean标签是最基础的标签。它表示了IoC容器中的?个对象。换句话说,如果?个对象想让spring管理,在XML的配置中都需要使?此标签配置,Bean标签的属性如下:
id属性: ?于给bean提供?个唯?标识。在?个标签内部,标识必须唯?。
class属性:?于指定创建Bean对象的全限定类名。
name属性:?于给bean提供?个或多个名称。多个名称?空格分隔。
factory-bean属性:?于指定创建当前bean对象的??bean的唯?标识。当指定了此属性之后,class属性失效。
factory-method属性:?于指定创建当前bean对象的???法,如配合factory-bean属性使?,则class属性失效。如配合class属性使?,则?法必须是static的。
scope属性:?于指定bean对象的作?范围。通常情况下就是singleton。当要?到多例模式时,可以配置为prototype。 init-method属性:?于指定bean对象的初始化?法,此?法会在bean对象装配后调?。必须是?个?参?法。
destory-method属性:?于指定bean对象的销毁?法,此?法会在bean对象销毁前执?。它只能为scope是singleton时起作?。

4.DI 依赖注?的xml配置
依赖注?分类

  • 按照注?的?式分类
    构造函数注?:顾名思义,就是利?带参构造函数实现对类成员的数据赋值。
    set?法注?:它是通过类成员的set?法实现数据的注?。(使?最多的)

  • 按照注?的数据类型分类
    基本类型和String
    注?的数据类型是基本类型或者是字符串类型的数据。
    其他Bean类型
    注?的数据类型是对象类型,称为其他Bean的原因是,这个对象是要求出现在IoC容器
    中的。那么针对当前Bean来说,就是其他Bean了。
    复杂类型(集合类型)
    注?的数据类型是Aarry,List,Set,Map,Properties中的?种类型。

依赖注?的配置实现之构造函数注? 顾名思义,就是利?构造函数实现对类成员的赋值。它的使?要求是,类中提供的构造函数参数个数必须和配置的参数个数?致,且数据类型匹配。同时需要注意的是,当没有?参构造时,则必须提供构造函数参数的注?,否则Spring框架会报错。

以上是关于Spring ioc基础内容的主要内容,如果未能解决你的问题,请参考以下文章

Spring基础入门之IoC注入

Spring基础:IOC概念引入

Spring第二天——IOC注解操作与AOP概念

Spring基础:注解方式创建对象IOC

[死磕 Spring 17/43] --- IOC 之从单例缓存中获取单例 bean

spring学习--基础概念