1.Spring介绍

轻量级一站式框架

Framework 框架:

某些组织或是个人实现了一系列的接口或者类,使用这些已经开发好的功能,完成自己的业务,简化开发的过程,提高开发效率。

Java框架大体分为三层:

表现层 业务逻辑层 数据持久层

Java主流框架(开发形式)演变:

servlet + Jsp + JavaBean

spring statemathine 持久化 还原状态 spring 持久层框架_实例化

三层开发:

表现层 业务逻辑层 数据持久层

spring statemathine 持久化 还原状态 spring 持久层框架_spring_02

现在开发形式:

ssm:

spring + springmvc + mybatis

SpringBoot:

springboot开发,约定大于配置。 快速开发

Spring框架

Spring全家桶:

比较多的企业级的解决方案。

The Spring Framework provides a comprehensive programming and configuration model for modern Java-based enterprise applications - on any kind of deployment platform.

A key element of Spring is infrastructural support at the application level: Spring focuses on the “plumbing” of enterprise applications so that teams can focus on application-level business logic, without unnecessary ties to specific deployment environments.

spring statemathine 持久化 还原状态 spring 持久层框架_实例化_03

Spring是一个轻量级别的开发框架,使用Spring框架的目的就是为了解决应用开发的业务逻辑与各层的耦合问题。Spring框架是一站式开发,换句话说 对 表现成 业务逻辑层 数据持久层都支持。

Spring框架的核心两点:

ioc(控制翻转)

aop(面向切面编程)

优点:

  1. 轻量级的开源框架
  2. 解决各层耦合问题
  3. 一站式框架

spring statemathine 持久化 还原状态 spring 持久层框架_实例化_04

  • Test :支持单元测试整合的
  • Core Container:核心容器
  • Aop+aspects :面向切面编程
  • (以下不甚重要)
  • Instrumentation:提供类加载器(不怎么用)
  • Messaging:用来映射消息
  • Data Access:和数据持有层进行交互的(时候,支持的……),属于事务管理
  • Web:表现层

2. Ioc

Inversion of controller —— 控制反转

创建对象

之前创建对象: new 类名()
现在:使用spring完成创建对象 并放在spring的容器管理。

Ioc是一种设计思想,将设计好的对象交给spring框架进行创建、管理,而不是简单的使用代码创建了。

入门案例:

添加依赖:

<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.6.RELEASE</version>
  </dependency>
</dependencies>

spring statemathine 持久化 还原状态 spring 持久层框架_实例化_05

创建spring的核心配置文件—xml:

spring statemathine 持久化 还原状态 spring 持久层框架_实例化_06

使用:

spring statemathine 持久化 还原状态 spring 持久层框架_实例化_07

创建了一个bean 放在spring的容器中
上下文对象 applicationContex.getBean(xxxx.class);

Spring创建bean对象存储到:

存储到了集合中了 map集合存储的

Ioc的优点:

  1. 集中管理核心对象
  2. 功能的复用,减少对象的创建和内存的消耗
  3. 提高程序的灵活性
  4. 解耦

bean默认实例化:

<bean id="car" class="com.langsin.model.Car"></bean>

以上程序 *默认实例化的时候,使用的是无参数的构造方法*

Di:

依赖注入 为属性赋值

*默认使用的setter方法 ,属性必须有set方法*

以下程序是为属性赋值:

1.简单类型

<!--测试di  默认使用的是无参数的构造方法-->
<bean id="car" class="com.langsin.model.Car">
    <property name="color" value="blue"></property>
    <property name="name" value="bm"></property>
</bean>

2.为复杂数据类型进行注入

<!--创建bean
    id:在容器中必须是唯一的
    class:类的全名称  包名+类名  反射的形式 创建bean对象
     property:  为属性进行依赖注入
         ref:注入bean
         value:注入的是简单类型的值-->
<bean id="helloService" class="com.langsin.service.HelloService">
    <property name="car" ref="car"></property>
    <!--这里的ref="car"引用的是下面的简单类型的值-->
</bean>


    <!--测试di 默认使用的是无参构造方法-->
    <bean id="car" class="com.langsin.model.Car">
        <property name="color" value="bule"></property>
        <property name="name" value="bm"></property>
    </bean>

Spring对IOC的实现形式:

1.配置文件形式

使用的是xml文件的形式进行bean的配置。

特点: 简单、适合入门 、直观的。

1.1 Bean实例化形式
命名bean:
<!--进行bean的配置
id:唯一的-->
<bean id="user" class="com.langsin.model.User"></bean>
实例化bean:
①使用构造方法实例化bean

默认无参数的构造方法

有参数的构造方法也可以使用
<bean id="user" class="com.langsin.model.User">
    <!--通过构造方法进行依赖注入-->
    <constructor-arg name="address" value="济南市"></constructor-arg>
    <constructor-arg name="userName" value="langsin"></constructor-arg>
    <constructor-arg name="passWord" value="langsin"></constructor-arg>
</bean>
②静态工厂方式实例化
<!--通过静态工厂方法进行实例化-->
<bean id="user"  class="com.langsin.model.User" factory-method="getUser"></bean>
/**
 * 静态工厂方法
 * @return
 */
public static User  getUser(){
    System.out.println("使用静态工厂方法实例化");
    return new User();
}
③使用实例工厂方法进行bean的实例化
<!--工厂-->
<bean id="userFactory" class="com.langsin.factory.UserFactory"></bean>
<!--实例化工厂方法-->
<bean id="user" class="com.langsin.model.User"
      factory-bean="userFactory"
      factory-method="getUser"></bean>
public class UserFactory {
    /**
     * 实例化方法
     */
    public User  getUser(){
        System.out.println("实例化工厂方法进行实例化操作");
        return new User();
    }
}
1.2 依赖注入
① setter方法的形式进行

属性必须有set方法 属性名必须满足java的规范 驼峰命名法

属性名:name 反射:setName

属性名:userName 反射:setUserName

<bean id="user" class="com.langsin.model.User">
  <property name="address" value="济南市长清区"></property>
  <property name="userName" value="langsin"></property>
  <property name="passWord" value="admin"></property>
</bean>
②通过构造方法进行注入
<bean id="user" class="com.langsin.model.User">
    <!--简单类型进行注入 使用的value-->
    <property name="address" value="济南市长清区"></property>
    <property name="userName" value="langsin"></property>
    <property name="passWord" value="admin"></property>
    <!--复杂类型进行注入 使用ref 注入bean-->
    <property name="car" ref="car"></property>
</bean>

<bean id="car"  class="com.langsin.model.Car"></bean>

细节:

<bean id="user" class="com.langsin.model.User">
    <!--简单类型进行注入 使用的value-->
    <property name="address" value="济南市长清区"></property>
    <property name="userName" value="langsin"></property>
    <property name="passWord" value="admin"></property>
    <!--复杂类型进行注入 使用ref 注入bean-->
    <property name="car" ref="car"></property>
    <!--注入list-->
    <property name="addressList">
        <list>
            <value>济南市长清区</value>
            <value>济南市槐荫区</value>
            <value>济南市历下区</value>
        </list>
    </property>
    <!--注入map结构-->
    <property name="phoneMap">
        <map>
            <entry key="张三" value="97979797979"></entry>
            <entry key="李四" value="97979797979"></entry>
        </map>
    </property>
</bean>

denpends-on:控制先加载的bean 可以控制bean的加载顺序

<bean id="user" class="com.langsin.model.User" depends-on="car">

ApplicationContext 加载核心配置文件的时候,已经完成了bean的实例化操作,bean的实例化不是懒加载的。

可以自己控制懒加载,使用bean的时候才进行实例化 lazy-init=true

<bean id="user" class="com.langsin.model.User" lazy-init="true"></bean>

bean默认是单例的

scope:singleton  单例

prototype 多例

<bean id="user" class="com.langsin.model.User"  scope="prototype"></bean>

bean生命周期对应方法

实例化

初始化的方法 init-method=’xxxxx’

销毁的方法 destory-method=’xxxx’ 上下文对象调用close方法,才执行销毁方法

<bean id="user" class="com.langsin.model.User" init-method="initMethod" destroy-method="destroyMethod">