学习笔记 : 初识 Spring

Spring 简介

Spring是由Rod Johnson组织和开发的一个分层的Java SE/EE full-stack(一站式)轻量级开源框架,它以IoC(Inversoin of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)为内核,使用基本的JavaBean来完成以前只可能由EJB(Enterprise Java Beans,Java企业Bean)完成的工作.取代了EJB的臃肿,低效的开发模式哟 !

Spring 框架优点

Spring 具有简单,可测试和松耦合等特点,从这个角度出发,Spring可适用于服务器端/任何Java应用的开发.

  1. 非侵入式设计
  2. 方便耦合,简化开发
  3. 支持AOP
  4. 支持声明式事务处理
  5. 方便程序的测试
  6. 方便集成各种优秀的框架
  7. 降低Java EE API的使用难度

Spring 核心容器

Spring框架的主要功能是通过其核心容器来实现.Spring框架提供了两种核心容器,分别是BeanFatoryApplicatoinContext.

BeanFactory

BeanFactory为基础类型的Ioc容器,简单的说就是一个管理Bean的工厂,它主要负责初始化各种Bean,并调用它们的生命周期方法.

ApplicationContext

ApplicationContextBeanFactory的子接口,也称为应用上下文,不仅包含了BeanFactory的所有功能,还添加了对国际化,资源访问,事件传播等方面的支持.有两种创建ApplicatoinContext接口实例的方法.

  1. 通过ClassPathXmlApplicationContext创建

通过类路径classPath中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作.

  1. 通过FileSystemXmlApplicatoinContext创建

通过指定的文件系统路径(绝对路径)中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作.

依赖注入

依赖注入的作用就是在使用Spring框架创建对象时,动态地将其所依赖的对象注入Bean组件中,其实现方式通常有两种,一种是属性setter方法注入,另一种是构造方法注入.

属性setter方法注入

指Spring容器使用setter方法注入被依赖的实例.通过调用无参的构造器或无参静态工厂方法实例化Bean后,调用该Bean的setter方法,即可实现基于setter方法的依赖注入.

构造方法注入

指Spring容器使用的构造方法注入被依赖的实例.基于构造方法的依赖注入通过带参数的构造方法来实现,每个参数代表着一个依赖.

Spring 简单示例程序

  1. 创建一个简单的Java bean

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    package pers.huangyuhui.spring.bean;

    public class HiSpring5 {

    private String name;

    public HiSpring5() {
    System.out.println("The Constructor be called !");
    }

    public void setName(String name) {
    System.out.println("setName(String name) method be called !");
    this.name = name;
    }

    public void ouputName() {
    System.out.println("ouputName() method: my name is " + name + " !");
    }
    }
  2. 创建Spring的配置文件: applicationContext.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?xml version="1.0" encoding="UTF-8"?>
    <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.xsd">

    <!--
    id: IOC容器中Bean的唯一标识
    class: 通过反射机制在IOC容器中创建Bean(所以要求Bean中必须有无参的构造器).
    -->
    <bean id="SpringTestID" class="pers.huangyuhui.spring.bean.HiSpring5">
    <!-- 初始化HiSpring类中的属性名为name的值 -->
    <property name="name" value="Spring"></property>
    </bean>

    </beans>
  3. 测试类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    package pers.huangyuhui.spring.bean.test;

    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;

    import pers.huangyuhui.spring.bean.HiSpring5;

    public class Spring5Test {

    @Test
    public void test() {


    // 创建Spring的IOC对象
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

    // 从IOC容器中获取Bean实例
    HiSpring5 hiSpring5 = (HiSpring5) applicationContext.getBean("SpringTestID");

    hiSpring5.ouputName();

    }

    }
  4. 程序运行结果如下

    1
    2
    3
    4
    5
    6
    7
    8
    May 14, 2019 4:23:28 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
    INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@a2431d0: startup date [Tue May 14 16:23:28 CST 2019]; root of context hierarchy
    May 14, 2019 4:23:28 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    INFO: Loading XML bean definitions from class path resource [applicationContext.xml]

    The Constructor be called !
    setName(String name) method be called !
    ouputName() method: my name is Spring !