Spring框架(一)

Spring概述

Spring是一个分层的 JavaSE/JavaEE 一站式(full-stack)轻量级开源框架。

Spring兴起于2003,前身来源于EJB架构,作者Rod Johnson

Spring的优势

  • 方便解耦,简化开发

  • AOP编程的支持

  • 声明式事务的支持 编码式事务 转账 transfer方法手动植入进入 销户 DeleteAccount 事务支持

    提前在Spring的主配置文件/注解中applicationContext.xml去配置transfer deleteAccount

  • 方便程序的测试 Spring集成Junit

  • 方便集成各种优秀的框架 Jfinal、Mybatis Struts2 Hibernate...

  • 框架中的源码是需要借助学习的,经典的设计思想。设计模式....优秀的案例.....

Spring Framework的体系架构

spring体系

schema讲解

 <beans  xmlns="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:context="http://www.springframework.org/schema/context"
         xsi:schemaLocation="http://www.springframework.org/schema/beans"   
                            "http://www.springframework.org/schema/beans/spring-beans.xsd"
        "http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd"
        ">

配置约束的目的是为了在xml文件中进行配置的时候,能够按照提前约定好的约束进行标签的检验。

 

xml ns--->namespace 命名空间

 

一般配置一个xml文件最多只能有一个匿名的命名空间

对于Spring框架来说,它把匿名的命名空间给beans使用了 。如果需要配置的话,xmlns:aa

那么当使用beans中的标签的时候,需要在aa:bean

因为我们要使用bean的约束,xml整体的约束采用schema约束,所以我们配置schema约束地址,

schemaLocation 约束方式采用key-value键值对的方式,

schemaLocation 约束依赖于http://www.w3.org/2001/XMLSchema-instance

所以xml配置首先http://www.w3.org/2001/XMLSchema-instance给他起了个别名 别名的名字叫xsi

IOC控制反转

  Inversion Of Control  控制反转,将对象的创建权交给了Spring,提前在Spring容器把该对象信息构建好,我们可以通过Spring容器调用getBean("name属性或者id属性")获取到对应的对象。
  • ApplicationContext,使用它需要借助于它的实现类ClassPathXmlApplicationContext,默认会在创建的时候,将内部配置的所有对象全部加载到Spring容器中

  • ClassPathXmlApplicationContext,将来我们可以从classpath的目录下加载到Spring主配置文件。

bean元素的配置和创建

凡是交给Spring容器管理的对象,都可以通过bean元素进行配置。

Spring的本质就是对象管理容器】 

name属性和class属性

  • name属性:作用就是给创建的对象起一个名字,将来在应用中通估这个名字获取到这个对象

  • class属性:创建该对象映射的那个类 反射机制 类名 = 包名+类名

  • id属性: id属性和name属性的作用是一样的,name属性的名称值可以重复,但是id值不允许重复,唯一

    id属性值不能含有特殊字符,但是在使用中,一般把name属性值在容器的设置也是唯一的。

bean元素的创建

bean元素的创建默认采用空参构造方法创建对象。如果没有空参构造,那么一般就会报错。

  • 空参构造方法创建

<bean id="user" class="com.zhiyou100.pojo.User"></bean>
  • 静态工厂方式创建

<bean id="userStatic" class="com.zhiyou100.pojo.BeanFactory" factory-method="getStaticBean"></bean>
  • 实例工厂方式创建

<bean name = "UserBeanFactory" class="com.zhiyou100.pojo.BeanFactory"></bean>
<bean name = "userFactory" factory-bean="UserBeanFactory" factory-method="getUser"></bean>

scope属性

scope 范围 指的设置bean元素创建对象的方式

  • singleton: 单例模式,当前的对象在容器中只会创建一次,容器只会保存该类的一个对象 默认采用的是单例模式

    Spring认为一个bean就应该有且仅有一个对象

  • prototype :多例模式,当前对象在容器中每次调用getBean返回的都是新对象。

    在Structs2容器中,采用的是多例模式。每一个action都要配置成prototype

  • request 请求域中

  • session 会话 在服务器中

  • globalSession 全局的,跨session存储的

bean元素的生命周期

 生命周期 : 从生到死。从创建到消亡
  • init-method:初始化方法 初始化bean对象

    init-method bean对应的空参构造方法

  • destroy-method:销毁方法 当对象销毁的时候,会执行该方法。

    • 第一种情况,就是这个对象长期不用,GC就认为它是一个垃圾,GC就会清除掉

    • 第二种情况,当这个容器销毁/关闭的时候,存储在该容器中的bean对象也会销毁。

  • bean元素默认是交给Spring管理的。但是如果你把该bean元素的scope属性设置为多例模式,那么Spring只管生,不管死。在单例模式下,Spring管理bean元素的整个生命周期。

依赖注入DI

 DI   Dependency Injection     依赖注入 ,有IOC环境的支持,Spring创建这个类的过程中,Spring将类的依赖的属性设置进去。

注入方式

如果是基本类型(String),则使用value,如果是引用类型使用ref

  • set方法注入

    该对象对应的类中必须有set方法,否则无法正常注入。

<bean id="user" class="com.lk.pojo.User">
        <property name="id" value="1"/>
        <property name="username" value="若思"/>
        <property name="gender" value="false"/>
        <property name="birthday" ref="date"/>
        <property name="role" ref="role"/>
</bean>
<bean id="date" class="java.util.Date"/>
  • 构造方法注入

<bean id="user3" class="com.lk.pojo.User">
        <constructor-arg name="id" value="3" type="java.lang.Integer" index="0"/>
        <constructor-arg name="username" value="若楠" type="java.lang.String" index="1"/>
        <constructor-arg name="gender" value="false" type="java.lang.Boolean" index="2"/>
        <constructor-arg name="birthday" ref="date" type="java.util.Date" index="3"/>
        <constructor-arg name="role" ref="role" type="com.lk.pojo.Role" index="4"/>
</bean>

 

  • p名称空间注入

<bean id="user2" class="com.lk.pojo.User" p:id = "2"
    p:birthday-ref="date" p:username="若涵" p:gender="false"/>
  • Spel 表达式注入

<bean name="user4" class="com.lk.pojo.User">
        <property name="id" value="#{role.id == 1 ? 4 : 5}" />
        <property name="username" value="#{user.username.equals('阿南') ? '安安' : '囡囡'}"/>
        ......
</bean>
  • 复杂类型注入【数组集合 List Set Map】

原文地址:https://www.cnblogs.com/lk625/p/14477324.html