• 创建Spring的主要目的是用来替代更加重量级的企业级Java技术,尤其是EJB(Enterprise JavaBean 企业级JavaBean)。相对于EJB来说,Spring提供了更加轻量级和简单的编程模型。它增强了简单老式Java对象(Plain Old Java Object, POJO)的功能,使其具备了之前只有EJB和其他企业级Java规范才具有的功能。
  • Spring是为了解决企业级应用开发的复杂性而创建的。为了降低Java开发的复杂性,Spring采取了以下4种关键策略:
  1. 基于POJO的轻量级和最小侵入性编程
  2. 通过依赖注入和面向接口实现松耦合
  3. 基于切面和惯例进行声明式编程
  4. 通过切面和模板减少样版式代码
  • 任何一个应用都会由两个或者更多的类组成,这些类相互之间进行协作来完成特定的业务逻辑。按照传统的做法,每个对象负责管理与自己相互协作的对象(即它所依赖的对象)的引用,这将导致高度耦合和难以测试的代码。
  • 依赖注入DI带来的最大收益--松耦合,如果一个对象只通过接口(而不是具体实现或初始化过程)来表明依赖关系,那么这种依赖就能够在对象本身毫不知情的情况下,用不同的具体实现进行替换。
  • Spring通过应用上下文(Application Context)装载bean的定义并把它们组装起来,Spring应用上下文全权负责对象的创建和组装。
  • DI能够让相互协作的软件组件保持松散耦合,而面向切面编程(AOP)允许你把遍布应用各处的功能分离出来形成可重用的组件。
  • 在基于Spring的应用中,应用对象生存于Spring容器中。Spring容器负责创建对象,装配它们,配置它们并管理它们的整个生命周期。
  • Spring自带了多个容器实现,可以归为两种不同的类型:
  1. bean工厂(由org.springframework.beans.factory.BeanFactory接口定义)是最简单的容器,提供基本的DI支持。
  2. 应用上下文(由org.springframework.context.ApplicationContext接口定义)基于BeanFactory构建,并提供应用框架级别的服务。应用上下文比bean工厂更受欢迎。

    Spring常用的应用上下文:

  • AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载Spring应用上下文
  • AnnotationConfigWebApplicationContext:从一个或多个基于Java的配置类中加载SpringWeb应用上下文
  • ClassPathXMLApplicationContext:从类路径下的一个或多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源
  • FileSystemXMLApplicationContext:从文件系统下的一个或多个XML配置文件中加载上下文定义
  • XMLWebApplicationContext:从Web应用下的一个或多个XML配置文件中加载上下文定义
  • bean的生命周期:

  

  • Spring Bean的生命周期:

  

  1. Spring对Bean进行实例化
  2. Spirng将值和Bean的引用注入到Bean对应的属性中
  3. 如果Bean实现了BeanNameAware接口的setBeanName方法,那么就会调用这个方法。
  4. 如果Bean实现了BeanFactoryAware接口的setBeanFactory方法,那么就会调用这个方法。
  5. 如果Bean实现了ApplicationContextAware接口的setApplicationContext方法,且Spring IoC容器也必须是一个ApplicationContext接口的实现类,那么才会调用这个方法。
  6. 如果Bean实现了BeanPostProcessor接口的postProcessBeforeInitialization方法,那么就会调用这个方法
  7. 如果Bean实现了InitializingBean接口的afterPropertiesSet方法,那么就会调用这个方法
  8. 如果Bean自定义了初始化方法,即使用init-method声明了自定义的初始化方法,那么就会调用这个方法
  9. 如果Bean实现了BeanPostProcessor接口的postProcessAfterInitialization方法,那么就会调用这个方法。
  10. 至此,Bean就完成了初始化,Bean就生存在Spring IoC容器中,使用者就可以从中获取Bean的服务。当服务器正常关闭,或者遇到其他关闭Spring IoC容器的时间,就会完成Bean的销毁。
  11. 如果Bean实现了接口DisposableBean接口的destory方法,那么就会调用这个方法。
  12. 如果Bean自定义了销毁方法,即使用destroy-method声明了自定义的销毁方法,那么就会调用这个方法。

  注意:BeanPostProcessor接口是针对所有Bean而言的,而其他接口则是针对单个Bean而言的。

  使用示例对Spring Bean的声明周期进行演示:

  1. Source类POJO  

    package com.ssm.chapter9.pojo;
    
    public class Source {
    private String fruit; // 类型
    private String sugar; // 糖分描述
    private String size; // 大小杯
    public String getFruit() {
    return fruit;
    }
    public void setFruit(String fruit) {
    this.fruit = fruit;
    }
    public String getSugar() {
    return sugar;
    }
    public void setSugar(String sugar) {
    this.sugar = sugar;
    }
    public String getSize() {
    return size;
    }
    public void setSize(String size) {
    this.size = size;
    } }

    Source类

  2. JuiceMaker2类,实现了BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean接口,和自定义的初始化方法init()和销毁方法destory(),以及业务方法makeJuice()
    package com.ssm.chapter9.pojo;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.beans.factory.BeanFactoryAware;
    import org.springframework.beans.factory.BeanNameAware;
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware; public class JuiceMaker2 implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean {
    private String beverageShop = null;
    private Source source = null; public String getBeverageShop() {
    return beverageShop;
    } public void setBeverageShop(String beverageShop) {
    this.beverageShop = beverageShop;
    } public Source getSource() {
    return source;
    } public void setSource(Source source) {
    this.source = source;
    } public String makeJuice() {
    String juice = "这是一杯由" + beverageShop + "饮品店,提供的" + source.getSize() + source.getSugar() + source.getFruit();
    return juice;
    } public void init() {
    System.out.println("【" + this.getClass().getSimpleName() + "】执行自定义初始化方法");
    } public void destroy() {
    System.out.println("【" + this.getClass().getSimpleName() + "】执行自定义销毁方法");
    } @Override
    public void setBeanName(String arg0) {
    System.out.println("【" + this.getClass().getSimpleName() + "】调用BeanNameAware接口的setBeanName方法"); } @Override
    public void setBeanFactory(BeanFactory arg0) throws BeansException {
    System.out.println("【" + this.getClass().getSimpleName() + "】调用BeanFactoryAware接口的setBeanFactory方法");
    } @Override
    public void setApplicationContext(ApplicationContext arg0) throws BeansException {
    System.out.println(
    "【" + this.getClass().getSimpleName() + "】调用ApplicationContextAware接口的setApplicationContext方法");
    } @Override
    public void afterPropertiesSet() throws Exception {
    System.out.println("【" + this.getClass().getSimpleName() + "】调用InitializingBean接口的afterPropertiesSet方法");
    }
    }

    JuiceMaker2类

  3. 实现了BeanPostProcessor接口的BeanPostProcessorImpl Bean
    package com.ssm.chapter9.bean;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor; public class BeanPostProcessorImpl implements BeanPostProcessor { @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    System.out.println("【" + bean.getClass().getSimpleName() + "】对象" + beanName + "开始实例化");
    return bean;
    } @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    System.out.println("【" + bean.getClass().getSimpleName() + "】对象" + beanName + "实例化完成");
    return bean;
    } }

    BeanPostProcessorImpl

  4. 实现了DisposableBean接口的DisposableBeanImpl Bean
    package com.ssm.chapter9.bean;
    
    import org.springframework.beans.factory.DisposableBean;
    
    public class DisposableBeanImpl implements DisposableBean {
    
        @Override
    public void destroy() throws Exception {
    System.out.println("调用接口DisposableBean的destroy方法");
    } }

    DisposableBeanImpl

  5. Spring配置文件spring-cfg.xml
    <?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-4.0.xsd"> <!--BeanPostProcessor定义 -->
    <bean id="beanPostProcessor" class="com.ssm.chapter9.bean.BeanPostProcessorImpl" /> <!--DisposableBean定义 -->
    <bean id="disposableBean" class="com.ssm.chapter9.bean.DisposableBeanImpl" /> <bean id="source" class="com.ssm.chapter9.pojo.Source">
    <property name="fruit" value="橙汁" />
    <property name="sugar" value="少糖" />
    <property name="size" value="大杯" />
    </bean> <bean id="juiceMaker2" class="com.ssm.chapter9.pojo.JuiceMaker2"
    destroy-method="destroy" init-method="init">
    <property name="beverageShop" value="贡茶" />
    <property name="source" ref="source" />
    </bean> </beans>

    Spring XML配置文件

  6. 测试方法
    package com.ssm.chapter9.main;
    
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.ssm.chapter9.pojo.JuiceMaker2;
    
    public class Chapter9Main {
    public static void main(String[] args) {
    testIoC();
    } public static void testIoC() {
    ClassPathXmlApplicationContext ctx =
    new ClassPathXmlApplicationContext("spring-cfg.xml");
    JuiceMaker2 juiceMaker2 = (JuiceMaker2) ctx.getBean("juiceMaker2");
    System.out.println(juiceMaker2.makeJuice());
    ctx.close();
    }
    }

    测试主方法

  7. 测试结果
    十月 09, 2018 8:44:28 上午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
    信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5e8c92f4: startup date [Tue Oct 09 08:44:28 GMT+08:00 2018]; root of context hierarchy
    十月 09, 2018 8:44:28 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    信息: Loading XML bean definitions from class path resource [spring-cfg.xml]
    【DisposableBeanImpl】对象disposableBean开始实例化
    【DisposableBeanImpl】对象disposableBean实例化完成
    【Source】对象source开始实例化
    【Source】对象source实例化完成
    【JuiceMaker2】调用BeanNameAware接口的setBeanName方法
    【JuiceMaker2】调用BeanFactoryAware接口的setBeanFactory方法
    【JuiceMaker2】调用ApplicationContextAware接口的setApplicationContext方法
    【JuiceMaker2】对象juiceMaker2开始实例化
    【JuiceMaker2】调用InitializingBean接口的afterPropertiesSet方法
    【JuiceMaker2】执行自定义初始化方法
    【JuiceMaker2】对象juiceMaker2实例化完成
    这是一杯由贡茶饮品店,提供的大杯少糖橙汁
    十月 09, 2018 8:44:28 上午 org.springframework.context.support.ClassPathXmlApplicationContext doClose
    信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@5e8c92f4: startup date [Tue Oct 09 08:44:28 GMT+08:00 2018]; root of context hierarchy
    【JuiceMaker2】执行自定义销毁方法
    调用接口DisposableBean的destroy方法

    测试结果

  • Spring框架由6个定义良好的模块分类组成:

  

Spring(一)Spring基础知识的更多相关文章

  1. Mock平台2-Java Spring Boot框架基础知识

    微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 认识Spring Boot 在N年前的大学时代想要开发一个Web服务使用的还是SSH框架(struts+spring+hibernate) ...

  2. spring笔记5 spring IOC的基础知识1

    1,ioc的概念 Inverse of control ,控制反转,实际的意义是调用类对接口实现类的依赖,反转给第三方的容器管理,从而实现松散耦合: ioc的实现方式有三种,属性注入,构造函数注入,接 ...

  3. spring笔记4 spring MVC的基础知识4

    //todo 5,spring MVC的本地化解析,文件上传,静态资源处理,拦截器,异常处理等 spring MVC 默认使用AcceptHeaderLocalResolver,根据报文头的Accep ...

  4. spring笔记3 spring MVC的基础知识3

    4,spring MVC的视图 Controller得到模型数据之后,通过视图解析器生成视图,渲染发送给用户,用户就看到了结果. 视图:view接口,来个源码查看:它由视图解析器实例化,是无状态的,所 ...

  5. spring笔记2 spring MVC的基础知识2

    2,spring MVC的注解驱动控制器,rest风格的支持 作为spring mvc的明星级别的功能,无疑是使得自己的code比较优雅的秘密武器: @RequestMapping处理用户的请求,下面 ...

  6. spring笔记1 spring MVC的基础知识1

    1,spring MVC的流程 优秀的展现层框架-Spring MVC,它最出彩的地方是注解驱动和支持REST风格的url.   流程编号 完成的主要任务 补充 1 用户访问web页面,发送一个htt ...

  7. spring 2.5 基础知识和与其他框架的集成

    spring环境搭建: 一:导入spring2.5所需的包,在classpath目录下建一个名为"beans.xml"模板文件: <?xml version="1. ...

  8. Spring基础知识

    Spring基础知识 利用spring完成松耦合 接口 public interface IOutputGenerator { public void generateOutput(); } 实现类 ...

  9. 学习Spring必学的Java基础知识

    [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http: ...

  10. Spring框架基础知识

    本人博客文章网址:https://www.peretang.com/basic-knowledge-of-spring-framework/ Spring框架简介 Spring , 一个开源的框架 , ...

随机推荐

  1. WPF 将字体文件 添加到 资源文件,并在后台代码使用

    先看结果 1.将字体文件,导入到资源文件,如: 添加后,自动生成 2.在窗体xaml中添加如: 3.在xaml窗体对应的cs文件中,为TextBlock指定字段 创建一个字段对象,并指定字体文件的所在 ...

  2. 从壹开始 [Admin] 之五 ║ 实现『按钮』级别权限配置

    一.前情回顾 哈喽大家好,在这个欢庆的日子里,老张祝大家工作都能蒸蒸日上!今天正好也是社团成立的第一天,我也是希望今天能是个纪念日,沾沾这个大喜庆! 放假这两天,倒是学到了很多东西,我这个也是承认的, ...

  3. Spring MVC-从零开始-view-ViewResolver

    主要ViewResolver简介 InternalResourceViewResolver 将逻辑视图名解析为一个路径 BeanNameViewResolver 将逻辑视图名解析为bean的name属 ...

  4. Spring boot 官网学习笔记 - Spring Boot CLI 入门案例

    安装CLI https://repo.spring.io/release/org/springframework/boot/spring-boot-cli/2.1.1.RELEASE/spring-b ...

  5. 使用.NET Core创建Windows服务(二) - 使用Topshelf方式

    原文:Creating Windows Services In .NET Core – Part 2 – The "Topshelf" Way 作者:Dotnet Core Tut ...

  6. Tornado基础学习篇

    1.1 Tornado是什么? Tornado是使用Python编写的一个强大的.可扩展的Web服务器.它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应 ...

  7. 解决mac OSX下安装git出现的"git命令需要使用开发者工具。您要现在安装该工具吗"(19款Mac)

    1.本地安装Git ,这里不做说明 2.命令行执行 sudo mv /usr/bin/git /usr/bin/git-system 3.如果提示 权限不足,操作不被允许,关闭Rootless,重启按 ...

  8. python串口助手

    最近项目中要使用模拟数据源通过向外发送数据,以前都是用C#编写,最近在研究python,所以就用python写了一个串口助手,方便以后的测试. 在电脑上通过虚拟串口助手产生两个虚拟串口,运行编写的串口 ...

  9. Android中Project、Module的区别

    Project 可以包含多含 Module. Project相当于eclipse里面的工作区间,module相当于其project.module可以作为狭义上的模块,可以多个app共用的module. ...

  10. Android 调用 WebService

    1.WebService简介 PS:如果看完上面简介还不是很清楚的话,那么就算了,之前公司就用C#搭的一个WebService! 本节我们并不讨论如何去搭建一个WebService,我们仅仅知道如何去 ...