spring学习 -----spring的概念及ioc xml配置

首先上一张目前流行框架ssm各个部分功能交互及职责图。

 

首先按下面流程了解spring

1、spring的概述
    1.1spring是什么
        *是分层的JavaSe/EE应用full-stack轻量级开源框架,以Ioc(反转控制)和Aop(面向切面编程)为内核,提供了展现层SpringMVC和持久层Spring Jdbc以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库.
    1.2spring的两大核心
        IOC (控制反转)        Aop(面向切面编程)
    1.3spring的发展历程和优势
        *优势:
            1、方便解耦、优化开发
            通过Spring提供的IOC容器,可以将对象间的依赖关系交友Spring进行控制,避免了硬盘编码所造成的过度程序耦合,用               户也不必再为单例模式类、属性问及那解析等这些很底层的需求编写代码,可以更专注与上层应用。
            2、AOp编码支持
            通过Spring的Aop功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过Aop轻松应付
            3、声明式事务的支持
            可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明方式灵活的进行事务管理,提高开发效率和质量。
            4、方便程序的测试
            可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可做的事情。
            5、方便集成各种优秀框架
                Spring可以降低各种框架的使用难度,提供了各种优秀的框架(struts、Hibernate、Hessian)的直接支持
            6、降低javaEE ApI的使用难度
                Spring对JavaEE ApI(如JDBC、javaMail、远程调用等)进行了薄薄的封装层,使这些API的使用难度大为降低
            
      spring的体系结构
     2、程序的耦合以及解耦
          工厂模式解耦
     3、IOC概念和spring中的IOC
          spring中基于XML的IOC环境搭建
     4、依赖注入(Dependency Injection)

 

首先按上述步骤先了解单例和多例的概念:

第二了解工厂模式解耦图解:

                                                            解耦概念:
               App -->资源                                                                                                       App-->工厂-->资源


                                               

 

1~1、ioc控制反转
    *将程序直接指向资源,到程序指向BeanFactory/ApplicationContext工厂再指向资源
ApplicationContext的常用实现类:
    *classpathXMLApplicationContext:它可以加载类路径下的配置文件,如果不再类路径下就无法加载
    *FileSystemXMLApplicateContext:他可以加载磁盘任意路径下的文件,前提是要有访问权限
    *AnnocationConfigApplicateContetx:它用于注解实现配置文件

核心容器ApplicationContext和BeanFacotory的区别?
    *ApplicationContext(实际开发用的多):作为核心容器时,是采用立即加载的方式,就是说读取完配置文件马上就会创建配置文件的对象(单例模式适用,用之前就创建了,只有一个对象就不会产生线程安全问题)
    *BeanFacotory:作为核心容器时,采用延迟加载的方式,读取完配置文件后不会立即创建对象,而是什么时候根据id获取对象时就创建对象(多例模式适用,在使用时创建,要多少创建多少)

在使用spring时会导入spring的jar包,接下来简单介绍它导入的jjar包对应功能
spring-context
spring-core
spring-expression        这四个是核心容器
spring-beans

spring-jcl:是aparce日志文件集成
spring-aop:里面有两种 注解和配置文件(XML)两种实现方式

 

 Bean:有可重用的组件意思
 javaBean:用java语言编写的可重用组件
 JavaBean>>实体类

spring对bean的管理:
1、创建bean的三种方式:
        1.1<bean  id="IAccountServiceImpl" class="com.cx.Spring.Service.IAccountServiceImpl"></bean>
        *通过bean标签实现时,当bean标签里面只写了id和class属性时,这时会调用默认构造函数创建对象,如果默认构造函数被有参构造覆盖并且没有重写,就会报错。
        1.2<bean id="factory_1" class="com.cx.Spring.factory.factory_1"></bean>
        <bean id="IAccountServiceImpl" factory-bean="factory_1" factory-method="getInstance"></bean>

        *当类存在jar包中,我们无法获取到他是否存在默认的构造函数时就使用此方式创建bean。
            通过工厂的方法创建对象,或者说使用某个类中的方法创建对象存入spring容器中
        1.3<bean id="IAccountServiceImpl1" class="com.cx.Spring.factory.factory_2" factory-                                       method="getInstance"></bean>
        *这和1.2一样是通过工厂类加载对象,不同的是产生对象的方法是静态的,所以这个会优先加载,所以直接通过全限定类名获取到类在通过方法获取内容。


2、bean的作用范围:
        bean标签的scope属性:
            用于指定bean标签的作用范围:
                    singleton:单例的(默认):

<bean id="IAccountServiceImpl2"     class="com.cx.Spring.Service.IAccountServiceImpl" scope="singleton">
                    prototype:多例的
<bean id="IAccountServiceImpl2" class="com.cx.Spring.Service.IAccountServiceImpl" scope="prototype">
                    session:作用域web应用的会话范围
<bean id="IAccountServiceImpl2" class="com.cx.Spring.Service.IAccountServiceImpl" scope="session">
                    request:作用与web应用的请求范围
<bean id="IAccountServiceImpl2" class="com.cx.Spring.Service.IAccountServiceImpl" scope="request">
                    globle-session:作用与集群环境的会话范围,当他不是集群时他就是session,全局session
<bean id="IAccountServiceImpl2" class="com.cx.Spring.Service.IAccountServiceImpl" scope="globle-session">

全局session介绍

3、bean的生命周期:
        单例模式:
                出生:随着容器一起被创建
                init-method="创建的方法名"//创建
                活着:容器被创建后一起留存
                死亡:容器被销毁,也被销毁
                destory-method="销毁的方法名"//销毁
                总结:容器在,它就在
        多例模式:
                出生:配置文件一读取完就会被创建,
                活着:对象一直被使用就会一直存在
                死亡:这里spring不知道什么时候销毁,所有不会轻易删除,所以等垃圾回收机制删除

4、Spring中的依赖注入(参数赋值):Dependency  Injection
    IOC的作用:降低程序间的依赖关系(耦合)
    依赖注入的引入:对于程序间的依赖关系,以后都交由spring来处理,创建类时所需要的其他对象,都由spring来提供,我们只需要在配置文件中声明。
 依赖关系的维护就是叫依赖注入

能够注入的类型:
            基本数据类型和String类型
            前面配置过的bean类型
            复杂或集合类型:<!-- set注入实现注入数组/集合等复杂类型 -->

注入方式;
        1、通过注解注入
        2、通过构造函数注入:    

<!-- 通过构造方法注入
bean标签里有一个constructor标签,当构造方法参数为有参而没有提供无参的构造时
标签中的属性:
        type:用于指定要注入的数据类型,也是构造方法中的某个或某些参数
        index:用于指定要注入给构造函数的位置,下标为0
        name:用于指定要注入数据类型在构造函数中的名称(常用)
        +++++++++++++++用于找到构造函数中的要被注入的参数+++++++++++++++++++
        value:用于基本数据类型和String数据类型的指定
        ref:用于引用关联的bean对象-->

优势:当注入数据时,注入数据必须和构造参数一致,用户无法干预
缺点:这些数据用不用都必须提供
<bean id="IAccountServiceImpl" class="com.cx.Spring.Service.IAccountServiceImpl">
    <constructor-arg name="id" value="18"></constructor-arg>
    <constructor-arg name="name" value="扎扎"> </constructor-arg>
    <constructor-arg name="date" ref="date1"></constructor-arg>
</bean>
<!-- 创建一个bean对象 -->
<bean id="date1" class="java.util.Date"></bean>
        3、通过set方法注入

<!-- 通过set方法注入  (常用)
bean标签里有一个property标签,用类中的set方法注入值
标签中的属性:
        name:用于指定要注入参数的set那个属性
        +++++++++++++++用于找到构造函数中的要被注入的参数+++++++++++++++++++
        value:用于基本数据类型和String数据类型的指定
        ref:用于引用关联的bean对象-->
 优势:创建对象没有明确的限制,可以直接使用默认构造函数
 缺点:当某个参数必须有值时,无法保证都已经调用了set方法
<!-- 创建一个bean对象指定date类型的bean -->
<bean id="date1" class="java.util.Date"></bean>

<bean id="IAccountServiceImpl" class="com.cx.Spring.Service.IAccountServiceImpl1">
    <property name="id" value="id"></property>
    <property name="name" value="name"></property>
    <property name="date" ref="date1"></property>
</bean>

 

 复杂或集合类型:<!-- set注入实现注入数组/集合等复杂类型 -->

<bean id="IAccountServiceImpl2" class="com.cx.Spring.Service.IAccountServiceImpl2">
    <!-- 注入的数组类型 -->
    <property name="array">
        <array>
            <value>AAA</value>
            <value>BBB</value>
        </array>
    </property>
    <!-- 注入集合类型 -->
    <property name="arrayList">
        <list>
            <value>AAA</value>
            <value>BBB</value>
        </list>
    </property>
    <property name="list">
        <list>
            <value>AAA</value>
            <value>BBB</value>
        </list>
    </property>
    <property name="map">
        <map>
            <!--设置值的方法二-->
            <entry key="AAA" value="BBB"></entry>
            <!--设置的方法一-->
            <entry key="CCC">
            <value>BBB</value>
                </entry>
        </map>
    </property>
    <property name="properties">
        <props>
            <prop key="AAA">
                AAA
            </prop>
            <prop key="BBB">
                BBB
            </prop>
        </props>
    </property>
总结:
List数组集合:
        可用标签array 、list、set
Map键值对集合:
        可用标签props、map

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值