1.Spring 初识

Spring初识


Spring概念

  • Spring是开源的轻量级框架
  • Spring是一站式框架
  • 使用基本的JavaBean

spring的框架特征

  • 轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。
  • 控制翻转(英文简写 = ioc)——Spring通过一种称作控制反转(IoC)的技术促进了低耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
  • 面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
  • 容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
  • 框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
  • MVC——Spring的作用是整合,但不仅仅限于整合,Spring 框架可以被看做是一个企业解决方案级别的框架。客户端发送请求,服务器控制器(由DispatcherServlet实现的)完成请求的转发,控制器调用一个用于映射的类HandlerMapping,该类用于将请求映射到对应的处理器来处理请求。HandlerMapping 将请求映射到对应的处理器Controller(相当于Action)在Spring 当中如果写一些处理器组件,一般实现Controller 接口,在Controller 中就可以调用一些Service 或DAO 来进行数据操作 ModelAndView 用于存放从DAO 中取出的数据,还可以存放响应视图的一些数据。 如果想将处理结果返回给用户,那么在Spring 框架中还提供一个视图组件ViewResolver,该组件根据Controller 返回的标示,找到对应的视图,将响应response 返回给用户。
    本段摘录 百度百科

Spring核心两部分

1. aop 面向切面

  • 扩展功能,但不修改源代码

2. ioc 控制反转

  • 之前的做法,创建对象 使用 new的形式
  • 现在的做法,只需对Spring 进行xml的配置即可

Spring 一站式框架

  1. Spring在javaee三层结构的中,每层都提供了不同的解决技术
    1. web 层 —– SpringMVC
    2. service 层 —– Spring 的 ioc
    3. dao 层 —– spring 的 jdbcTemplate

Spring的入门

ico 的使用

  1. 把创建对象交给了Spring进行管理
  2. ioc 操作两部分:
    1. ico的配置文件方式
    2. ico的注解方式

ioc底层原理

  1. 文字描述
    1. xml配置文件
    2. dom4j 解决 xml
    3. 工厂设计模式
    4. 反射
  2. 图形描述

    • 过程
      过程
    • 原理

      过程

ioc入门案例

  1. 导入jar包
    1. 每个jar包都有jar包\文档\源代码
    2. 核心jar包
      • beans
      • core
      • context
      • expression
    3. 日志jar包
      • log4j
      • commons-logging
  2. 创建一个类和方法
public class User{
    public void add(){
        System.out.println("add....")
    }
}
  1. 创建Spring的配置文件,配置类
    AppBean.xml
<!-- 1. 约束 -->
<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-2.5.xsd">

<!-- 2.配置 -->
<bean id="user" class="com.bean.User"></bean>
  1. 写代码测试对象创建
//实际中不这么用 这只是个测试
public class Test{
    public void main(String[] args){
        //1. 加载spring的配置文件
        Application context = 
                new ClassPathXmlApplictionContext("AppBean.xml")
        //得到配置创建对象
        User user = (User) context.getBean("user");
        user.add();
    }
}

Spring的bean管理

bean的三种实例化方式

1. 使用类的无参构造(重点)

配置方法

<!-- 使用类的无参构造创建对象 -->
<bean id="bean1" class="com.bean.User"></bean>

2. 使用静态工厂

  1. 创建静态方法
<!-- 配置 -->
<bean id="bean2" class="com.bean.User" factory-method="getUser"></bean>

3. 使用实例工厂

  • 比较麻烦
    1. 创建非静态方法
<!--创建工厂-->
<bean id="bean1" class="com.bean.Factory"></bean>
<!--获得对象-->
<bean id="bean2" class="bean1" factory-method="getUser"></bean>

bean标签的常用属性

  1. id 属性 : 名称可以任意命名,最好复合命名规则和规范
  2. class 属性 : 创建对象的全路径
  3. name 属性 : 和id一样(基本不用了)
  4. scope 属性 : 作用范围

    1. singleton : 默认值,单例
    2. prototype : 多例
    3. request : web项目中,Spring创建一个Bean对象,并放入request域中.

    4. session: web项目中,Spring创建一个Bean对象,并放入session域中.

    5. globalSession: web项目中,Spring创建一个Bean对象,应用在Porlet环境,如果没有该环境,则放入session

属性的注入方式

  • 创建对象的时候,向类里面属性里赋值.
  • 有三种方式
    • 构造方法
    • set方法
    • 接口方法
      如图:
      属性的注入方式

Spring注入属性

  • 有两种方式

1. 构造方法

配置xml

<!-- 使用有参构造注入属性 -->
<bean id="abc" class="com.bean.User">
    <!-- 
    constructor : 构造器
    arg : 参数
    name="参数名称"
        value="值"
         -->
    <constructor-arg name="uname" value="雷鸣"></constructor>
</bean>

2. set方法(常用)

配置xml

<!-- 使用set方法注入属性 -->
<bean id="abc" class="com.bean.User">
    <!--
        name="属性名称"
        value="值"
    -->
    <property name="uname" value="雷鸣"></property>
</bean>

注意:必须有匹配的构造方法和set方法

Spring注入对象类型属性*

  • 创建一个service类和dao类
  • 在service中得到dao对
实现步骤
  1. 创建service类和dao类
  2. service中写dao类型的属性和set方法
  3. 配置文件 xml
    <!-- 配置dao -->
    <bean id="dao" class="co.bean.Sao"> </bean>
    <!-- 配置service -->
    <bean id="service" class="co.bean.Service">
    <!--
    注入dao对象
    name : servic类型里面属性的名称
    ref  : 写入引用数据类型 dao <这是dao配置的 -id- 名称>
    -->
        <probperty name="daoname" ref="dao"></property>
    </bean>

4.执行
用Spring在创建对象时,只需创建最外面的对象.

//加载配置文件
AplicationConttext context = new ClassPathAppliactionContext("bean.xml");
//得到配置文件的对象
Service service = (Service) context.getBean("service")

p名称空间注入

用 p: 的属性值 替代 -property-

<bean id="abc" class="com.bean.User" p:uname="luke"></bean>

Spring注入复杂数据

实体类

public class Person{
    private String[ ] array;
    private List< String > list;
    private Map< String , String > map;
    private Properties Properties;
    /**...省去setter和getter方法...*/
}

xml配置

<!-- bean 省略 -->
<!-- 数组 -->
<property name="array">
    <list>
        <value>雷鸣1</value>
        <value>雷鸣2</value>
        <value>雷鸣3</value>
    </list>
</property>
<!-- list -->
<property name="list">
    <list>
        <value>Class1</value>
        <value>Class2</value>
        <value>Class3</value>
    </list>
</property>
<!-- map -->
<property name="array">
    <map>
        <entry key="key1" value="value1"></entry>       
        <entry key="key2" value="value2"></entry>
        <entry key="key3" value="value3"></entry>
    </map>
</property>
<!-- properties -->
<property name="array">
    <props>
        <prop key="drivareclass">cpm.mysql.jdbc.Driver</prop>
        <prop key="username">root</prop>
    </props>
</property>

ico和di区别

IOC : 控制反转

  • 把对象交给Spring进行创建

DI : 依赖注入

  • 向类里面注入属性值
    关系:依赖注入不能单独存在 , 需要在IOC基础之上完成操作

Spring整合web项目原理

这里写图片描述

猜你喜欢

转载自blog.csdn.net/luke199257/article/details/80874597