• Spring是什么、spring容器、Spring三大核心思想DI(依赖注入)、IOC(控制反转)、AOP(面向切面编程)


    1.Spring

    (1)Spring是什么?

    是一个轻量级的、用来简化企业级应用开发的开发框架。

    注:
        a.简化开发:
        Spring对常用的api做了简化,比如,使用Spring
        jdbc来访问数据库,就不用再考虑如何获取连接、关闭连接、处理异常等等。
        b.解耦:
        Spring容器(Spring框架的一个模块)帮我们管理
        对象(包括对象的创建及对象之间的依赖关系),
        这样一来,对象之间的耦合度会大大降低,提供高了
        系统的维护性。
        c.集成其它框架:
        Spring可以将其它一些常用的框架集成进来,比如
        可以将Quartz,MyBatis等集成进来。
    

    (2)Spring容器

    1)Spring容器是什么?

    Spring框架的一个核心模块,用于管理对象。

    注:
        管理对象指的是,spring容器会用我们创建对象,
    并且建立对象之间的依赖关系。
    

    2)如何启动Spring容器?

    step1.导包。

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>3.2.8.RELEASE</version>
    </dependency>
    

    step2.添加配置文件(applicationContext.xml)。

    将配置文件添加到main/resources下。
    

    step3.启动Spring容器。

    ApplicationContext ac = 
        new ClassPathXmlApplicationContext(
                "applicationContext.xml");
    

    3)创建对象

    a.方式一  使用无参构造器

    step1. 给类添加无参构造器(缺省构造器)。
    step2.  在配置文件当中,使用bean元素来进行配置。
    
    <!-- 
        使用无参构造器来创建对象。
        id属性要求唯一。
        class属性指定类名(要写完整的类名)。
        注:
            在spring框架当中,将Spring容器所管理
            的对象称之为一个bean。   
        -->
        <bean id="ap1" class="first.Apple"/>
    
    step3. 启动容器,调用容器提供的getBean方法。
    
        //通过容器获得对象
        Apple ap1 = 
            ac.getBean("ap1",Apple.class);
    

    b.方式二  使用静态工厂方法 (了解)

    <!-- 
        使用静态工厂方法来创建对象。
        factory-method属性用于指定一个静态
        方法(static修饰的方法)。
        注:
          容器会调用指定类的静态方法来创建
        对象。
     -->
    <bean id="cal1" 
    class="java.util.Calendar" 
    factory-method="getInstance"/>
    

    c.方式三  使用实例工厂方法 (了解)

    <!-- 
        使用实例工厂方法来创建对象。
        factory-bean属性指定bean的id,
        factory-method属性指定一个方法。
        注:
            容器会调用该bean的方法来创建一个
            对象。
     -->
     <bean id="date2" factory-bean="cal1" 
     factory-method="getTime"/>
    

    4)作用域

    a.默认情况下,对于某个bean,容器只会创建一个实例。

    b.如果要让容器创建多个实例,需要设置bean的作用域。

    <!-- 
            scope属性用于指定作用域,
            缺省值是singleton,如果将值设置
            为prototype,则容器会创建多个实例。
         -->
        <bean id="eb1" 
            class="basic.ExampleBean" 
            scope="prototype"/> 
    

    5)生命周期

    spring容器在创建好对象之后,会调用初始化方法, 在销毁该对象之前,会调用销毁方法。

        <!-- 
            init-method属性:  指定初始化方法
            destroy-method属性:指定销毁方法。
            注:
                销毁方法只有当作用域为singleton
                才有效。
         -->    
        <bean id="mb1" 
        class="basic.MessageBean" 
        init-method="init" 
        destroy-method="destroy" 
        scope="singleton"/> 
    

    6)延迟加载

    a.默认情况下,容器启动之后,会将所有作用域为singleton的bean实例化。

    b.延迟加载指的是,通过设置lazy-init="true"告诉容器, 启动之后不再创建其实例。

        <!-- 
            lazy-init属性如果值为true,表示
            延迟加载。
         -->
        <bean id="lb1" class="basic.LazyBean" 
        lazy-init="true"/>
    

    (3)IOC和DI

    1)IOC是什么? (Inversion Of Controll 控制反转)

    对象之间的依赖关系应该由容器来建立。

    2)DI是什么? (Dependency Injection 依赖注入)

    容器通过调用set方法或者构造器来建立对象之间的依赖关系。

    注:
        IOC是目标,DI是手段。
    

    3)set方法注入

    step1. 为类添加set方法。

    step2. 在配置文件当中,使用property元素来配置set 方法注入。

        <!-- 
            property元素表示采用set方法注入。
            name属性用于指定set方法名
            (容器会将b大写,前面添加set来
            构造方法名)。
            ref属性用于指定被注入的bean的id。
         -->
        <bean id="a1" class="ioc.A">
            <property name="b" ref="b1"/>
        </bean>
    

    step3. 启动容器,调用getBean方法。

    3)set方法注入

    4)构造器注入

    step1. 添加相应的带参的构造器。

    step2. 使用<constructor-arg>元素来配置构造器注入。

     <bean id="cpu" class="ioc.Cpu"/>
        <!-- 
            constructor-arg元素用来配置构造器
            注入。
            index属性用于指定参数的下标。
            ref属性用于指定被注入的bean的id。
         -->
        <bean id="cp" class="ioc.Computer">
            <constructor-arg index="0" 
            ref="cpu"/>
        </bean>

    step3. 启动容器,调用getBean方法。

    4)自动装配 (了解)

    a.什么是自动装配?

    容器依据某些规则,自动查找符合要求的对象,
    然后建立对象之间的依赖关系。
    注: 容器仍然要调用set方法或者构造器。
    

    b.如何自动装配?

    使用autowire属性指定装配的规则:
    <bean id="wt1" class="autowire.Waiter"/>
        <!-- 
            autowire属性表示让容器自动建立
            对象之间的依赖关系,有三个值:
            byName:
                以属性名作为bean的id,查找
                对应的bean,然后调用set方法。
                注:如果找不到对应的bean,
                不会调用set方法。
            byType:
                以属性类型作为bean的类型,查找
                对应的bean,然后调用set方法。
                注:
                    如果找不到对应的bean,
                    不会调用set方法。
                    如果找到多个bean,会出错。
            constructor:
                类似于byType,只不过是调用构造器来
                完成  注入。  
         -->
    <bean id="rest" 
        class="autowire.Restaurant" 
        autowire="byType"/> 
    

    5)注入基本类型的值

    <bean id="vb" class="value.ValueBean">
        <property name="name" value="小包总"/>
        <property name="age" value="20"/>
    </bean>
    

    6)注入集合类型的值

    a.支持四种集合类型的值的注入,分别是List,Set,Properties,Map。

    b.注入方式如下:

        <property name="interest">
                <list>
                    <value>打猎</value>
                    <value>看书</value>
                    <value>编程</value>
                    <value>编程</value>
                </list>
            </property>
        <property name="city">
            <set>
                <value>洛阳</value>
                <value>金陵</value>
                <value>开封</value>
            </set>
        </property>
        <property name="score">
            <map>
                <entry key="english" 
                    value="59.5"/>
                <entry key="math" 
                    value="17"/>    
            </map>
        </property>
        <property name="db">
            <props>
                <prop key="username">tom</prop>
                <prop key="pwd">1234</prop>
            </props>
        </property>
    

    7)引用的方式注入集合类型的值

        <!-- 
            将集合类型的值配置成一个bean
         -->
        <util:list id="interestBean">
            <value>打猎</value>
            <value>看书</value>
            <value>编程</value>
        </util:list>
        <util:set id="cityBean">
            <value>北京</value>
            <value>南京</value>
            <value>东京</value>
        </util:set>
        <util:map id="scoreBean">
            <entry key="english" value="80"/>
            <entry key="math" value="90"/>
        </util:map> 
        <util:properties id="dbBean">
            <prop key="username">John</prop>
            <prop key="pwd">1234</prop>
        </util:properties>
        <bean id="vb2" class="value.ValueBean">
            <property name="interest" 
            ref="interestBean"/>
            <property name="city"
            ref="cityBean"/>
            <property name="score"
            ref="scoreBean"/>
            <property name="db"
            ref="dbBean"/>
        </bean>
    

    8)读取properties文件的内容

        <!-- 
            读取properties文件的内容。
            location属性用于指定要读取的文件的位置。
            注:
                classpath:表示依据类路径去查找相应的
                文件。
         -->
         <util:properties id="config" 
         location="classpath:config.properties"/>
    

    9)spring表达式

    a.spring表达式的作用?

    可以用来读取其它bean的属性
    

    b.用法如下图:

    
    
    
  • 相关阅读:
    Arrays类的使用
    System类的使用
    <---------------------装箱,拆箱的过程-------------------------->
    Calendar类的使用——闰年的计算
    Eclipse无法编译,提示错误“找不到或者无法加载主类”解决方法
    <--------------------------Date类的使用------------------------------>
    正则表达式
    <--------------------------StringBuffer的常用方法------------------------------>
    Object 及toString() 方法的重写
    <---------------线程修改名字、得到名字及开启------------------>
  • 原文地址:https://www.cnblogs.com/ahaijava/p/10064264.html
Copyright © 2020-2023  润新知