spring——spring的IOC和DI(Spring的核心思想)

什么是框架:

    框架就是将一些重复的重要的代码进行模块化的集成。方便以后直接进行调用,目的来提高开发效率。

        SSH: sturs2 spring hibernate

        SSM:SpringMVC Spring Mybatis

Spring框架:

    Spring的主要目的就是简化代码的开发,并且能够整合现阶段所有的主流框架,起到一个粘合剂的作用。在项目中使用Spring可以一站式的开发编程。编程效率大大提高。其中的IOCDI以及AOPSpring的两大核心技术。

Spring的IOC:

    IOC叫做控制反转,就是将对象的创建权利发生反转,之前自己手动的创建对象,现在变成由Spring容器帮助创建生成新的对象。从此程序员无需关注对象的创建过程。无需关注对象的生命周期。

    Peron p1 = new Person();    ----->自己手动完成

    Person p2 = spring容器.get***();  ----->由spring容器创建


Spring的IOC的实现步骤:

    0 导入jar包:

                                             

    1.创建实体类:bean只要被spring管理的对象就是一个bean

                                                

    2.编写配置文件(1.编写配置文件的头     2编写配置文件的实体内容)

        配置文件的名称:最好使用spring默认的名称 applicationContext.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-3.2.xsd ">
 
    <!--id="唯一标识这个bean" id绝对不能重复
        id的命名规则:首字母小写其他驼峰规则   PersonService
        class就是对象的具体路径
    -->
    <bean id="hello" class="bean.Hello"></bean>
 
</beans>

    3.启动Spring容器:从容器中获取对象,调用方法完成相应的功能。

                              

Spring对象创建和获取的原理:

    spring容器在启动时,需要解析配置文件,配置文件按照逐行解析形式创建对象,根据Beanclass属性,通过反射调用创建对象之后注入在spring容器内部。Spring内部通过map的形式存储已经生成的对象。map中的key就是beanID,map中的value就是创建好的对象

Spring创建对象的机制:

    如果在创建对象时,如果出现任何的错误,那么整个spring容器将不会被启动。

Spring中获取对象的方式:

                                        

    1.通过beanID获取对象:

        context.getBean("hello");  其中hello表示beanID

     2.通过class类型获取对象:context.getBean(Hello.class);   其中的参数表示class类型

        说明:虽然通过两种方式都可以获取对象,但是建议大家使用id获取,如果在xml中配置了多个class类型相同的bean那么就会报错。

                                                    

别名标签alias:

<!--别名标签
    name属性中写起别名的bean的ID
    alias 别名中文英文都可以
 --> 
<alias name="hello" alias="hello1610班"/>

    如果想给一个bean器多个名字需要使用别名标签。


创建对象的方式:

    1.默认构造方法创建对象(用的最多的)

        spring中默认创建对象的方式就是通过无参构造创建对象,所以以后在写构造方法时,一定要加无参构造,这样才能保证程序的正确运行。

     2.通过静态工厂创建对象(必须要有静态方法)

                                            

            静态工厂中,最为关键的部分就是静态方法,如果没有静态方法,那么必然报错。

            说明:通过静态方法创建对象,和通过类名.static方法 的方式一致。

 3.实例工厂创建对象--先实例工厂,再创建对象

            

<!--通过实例工厂创建对象  -->
<bean id="newInstanceFactory" class="factory.NewInstanceFactory"></bean>
<!--     factory-bean="生产对象的工厂" 
         factory-method="工厂类中的方法"
        和对象.方法名类似
-->
<bean id="calendar2" factory-bean="newInstanceFactory" factory-method="getCalendar"></bean>

 4.spring工厂创建对象

    1.spring工厂必须实现FactoryBean<T>接口其中泛型T表示生产的对象

    2.实现方法

            

    3.配置文件中的配置

<!--通过spring工厂创建对象
class="spring工厂的类型"
  -->
<bean id="calendar3" class="factory.SpringFactory"></bean>


spring创建对象的单例和多例scope:

    spring通过容器创建对象时,默认的都是单例的。在spring容器中对象只存在一份,如果使用该对象直接通过getBean()方法获取。

        1.在默认条件下对象是单例的

        2.scope="singleton"  强制是单例的

        3.scope="prototype"  代表多例对象

 

懒加载:

    问题:由于spring在启动时会逐行解析,为每一个bean都会创建对象,这样的方式不是特别高效。

    如果容器启动时只创建必须要使用的对象,而其他对象当调用getBean方法时才会被创建,这样的模式更加的高效

    懒加载:当什么时候调用getBean方法时对象才会被创建。

         说明:在默认条件下spring的懒加载不生效。

            lazy-init="false"  懒加载不生效

            lazy-init="true"  懒加载生效

            default-lazy-init="false"    全局的懒加载配置,如果为false则懒加载不生效,如果为true则全部的bean都懒加载

            lazy-init="default"  应该与全局变量配置保持一致

             如果全局变量与lazy-init不一致时以lazy-init为准


scope遇到lazy-init时的问题(多例就是懒加载):

    lazy-init="false"  scope="prototype" 设置懒加载不生效,scope为多例的。这时的配置lazy-init将不起任何效果,该配置必然懒加载。(因为spring只负责创建多例,不负责管理多例,所以多例的时候必然懒加载)

    在Spring中对象只维护单例对象,只负责单例对象的生命周期,如果对象为多例时,spring只管创建该对象交给用户使用后将不再管理该对象,让该对象自生自灭。

    注意:Spring只管单例不管多例,多例对象创建统统懒加载


自定义初始化和销毁方法:

    init-method="自定义方法的名称"   自定义的初始化方法

    destroy-method="自定义销毁方法的名称"   自定义的销毁方法,spring在关闭的时候就会调用销毁方法。

                            

容器中对象的生命周期:

    1.调用构造方法创建对象

    2.调动init方法初始化属性

    3.调用目标方法完成相应的功能

    4.调用销毁方法做收尾工作。



DI(依赖注入):

    依赖注入一般注入可以是基本类型、字符串、对象的引用、集合(List,Set,Map)

    注入的方式

        1.set方法注入

                                    

        2.map封装时使用linkedHashMap进行封装,是有序的

        3.为引入类型赋值

            通过ref可以为引用类型进行赋值,name是新建的那个引用的名字ref的值写的是beanID

                                    



说明:SpringIOC和DI的意义,使用了SpringIOC和DI能够在最大程度上减少代码的耦合性,并且扩展性特别的强。





猜你喜欢

转载自blog.csdn.net/weixin_40663800/article/details/80137890
今日推荐