《 Spring in action》复习笔记 - 第一章 Spring 之旅

版权声明:本文为博主原创作品,如需转载请标明出处。 https://blog.csdn.net/weixin_42162441/article/details/82655403

本章内容

  • Spring 的 bean 容器
  • 介绍 Spring 的核心模块

简化 Java 开发

为了降低 Java 开发的复杂性,Spring 采取了以下 4 种关键策略:

  • 基于POJO的轻量级和最小侵入性编程;
  • 通过依赖注入和面向接口实现松耦合;
  • 基于切面和惯例进行声明式编程;
  • 通过切面和模板减少样板式代码

激发 POJO 的潜能

相对于 EJB 的臃肿,Spring 尽量避免因自身的 api 而弄乱用户的应用代码,Spring不会强迫用户实现 Spring 规范的接口或继承 Spring 规范的类,相反,在基 Spring 构建的应用中,它的类通常没有任何痕迹表明你使用了 Spring 。最坏的场景是,一个类或许会使用 Spring 注解,但它依旧是 POJO 。

依赖注入

耦合具有两面性。一方面,紧密耦合的代码难以测试、难以复用、难以理解,并且典型的表现出修复一个 bug ,将会出现一个或者更多新的 bug 。另一方面,一定程度的耦合又是必须的——完全没有耦合的代码什么也做不了。为了完成有实际意义的功能,,不同的类必须以适当的方式进行交互。总而言之,耦合是必须的,但应当被小心谨慎地管理。
通过 DI ,对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定。对象无需自行创建或管理他们的依赖关系,依赖关系将自动注入到需要它们的对象当中去。

代码示例:

package com.springinaction.knights;

public class BraveKnight implements Knight {

    private Quest quest;

    public BraveKnight(Quest quest) {
        this.quest = quest;// quest被注入到对象中
    }

    @Override
    public void embarhOnQuest() throws QuestException {
        quest.embark();
    }

}

相较于自动创建 Quest ,此处是在构造器中把 Quest 作为参数注入,这也是依赖注入的一种方式,即构造器注入
创建应用组件之间协作关系的行为称为装配,Spring有多种装配Bean的方式,其中最常用的就是通过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.xsd">

    <bean id="knight" class="com.springinaction.knights.BraveKnight">
        <constructor-arg ref="quest"></constructor-arg>
    </bean>

    <bean id="quest" class="com.springinaction.knights.SlayDragonQuest"></bean>

</beans>

Spring 如何工作

Spring 通过应用上下文( ApplicationContext )来装载 Bean , ApplicationContext 全权负责对象的创建和组装。
Spring 自带了多种 ApplicationContext 来加载配。

示例:

package com.springinaction.knights;

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

public class KnightMain {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("knights.xml");// 加载Spring上下文
        Knight knight = (Knight) context.getBean("knight");// 获取knight Bean
        knight.embarhOnQuest();// 使用knight
    }
}

应用切面

AOP 可以使复杂的服务模块化,并以声明的方式将它们应用到相应的组件中去,这样,这些组件就具有更高内聚性以及更加关注自身业务,完全不需要了解可能涉及的系统服务的复杂性。总之,AOP 确保 POJO 保持简单。

容纳 bean

在 Spring 中,应用对象生存于 Spring 容器中,Spring 容器可以创建、装载、配置这些 Bean ,并且可以管理它们的生命周期。

Spring 的容器

  • bean 工厂( org.springframework.beans.factory.BeanFactory ):最简单的容器,提供基本的DI支持;
  • 应用上下文( org.springframework.context.ApplicationContext ):基于BeanFactory之上构建,提供面向应用的服务。

使用应用上下文

  • AnnotationConfigApplicationContext :从一个或多个基于 Java 的配置类中加载 Spring 应用上下文。
  • AnnotationConfigWebApplicationContext :从一个或多个基于 Java 的配置类中加载 Spring Web 应用上下文。
  • ClassPathXmlApplicationContext :从类路径中的XML配置文件加载上下文,会在所有的类路径(包括jar文件)下查找;
  • FileSystemXmlApplicationContext :从文件系统中读取XML配置文件并加载上下文,在指定的文件系统路径下查找;
  • XmlWebApplicationContext :读取Web应用下的XML配置文件并加载上下文;

bean 的生命周期

Spring中Bean的生命周期
1. Spring对Bean进行实例化;
2. Spring将值和Bean的引用注入进Bean对应的属性中;
3. 如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()接口方法;
4. 如果Bean实现了BeanFactoryAware接口,Spring将调setBeanFactory()接口方法,将BeanFactory容器实例传入;
5. 如果Bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()接口方法,将应用上下文的引用传入;
6. 如果Bean实现了BeanPostProcessor接口,Spring将调用postProcessBeforeInitialization()接口方法;
7. 如果Bean实现了InitializationBean接口,Spring将调用afterPropertiesSet()方法。类似的如果Bean使用了init-method声明了初始化方法,该方法也会被调用;
8. 如果Bean实现了BeanPostProcessor接口,Spring将调用ProcessAfterInitialization()方法;
9. 此时此刻,Bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁;
10. 如果Bean实现了DisposableBean接口,Spring将调用destory()方法,同样的,如果Bean中使用了destroy-method声明了销毁方法,也会调用该方法;

扫描二维码关注公众号,回复: 3374298 查看本文章

猜你喜欢

转载自blog.csdn.net/weixin_42162441/article/details/82655403
今日推荐