spring技术核心概念纪要

简介: 一、背景 springframework 从最初的2.5版本发展至今,期间已经发生了非常多的修正及优化。许多新特性及模块的出现,使得整个框架体系显得越趋庞大,同时也带来了学习及理解上的困难。 本文阐述了一些要点,并配合一些代码样例,这有助于快速理解 spring 框架。

一、背景

springframework 从最初的2.5版本发展至今,期间已经发生了非常多的修正及优化。许多新特性及模块的出现,使得整个框架体系显得越趋庞大,同时也带来了学习及理解上的困难。

本文阐述了一些要点,并配合一些代码样例,这有助于快速理解 spring 框架。

二、spring架构

核心容器层

Core 模块

提供了框架的基本组成部分,包括 IoC 及依赖注入功能。

Bean 模块

实现 Bean 管理,包括自动装配机制等功能; 其中BeanFactory是一个工厂模式的实现。

Context 模块

建立在 Core 和 Bean 模块基础上,通常用于访问配置及定义的任何对象。ApplicationContext 是上下文模块的重要接口。

SpEL 模块

表达式语言模块提供了运行时进行查询及操作一个对象的表达式机制。

数据访问/集成

JDBC 模块

用于替代繁琐的 JDBC API 的抽象层。

ORM 模块

对象关系数据库映射抽象层,可集成JPA,JDO,Hibernate,iBatis。

OXM 模块

XML消息绑定抽象层,支持JAXB,Castor,XMLBeans,JiBX,XStream。

JMS 模块

Java消息服务模块,实现消息生产-消费之类的功能。

Transaction 模块

事务模块为各种 POJO 支持编程式和声明式事务管理。

Web应用

Web 模块

Web MVC 提供了基于 模型-视图-控制器 的基础web应用框架。

servlet 模块

实现了统一的监听器以及和面向web应用的上下文,用以初始化 IoC 容器。

Web-Portlet

实现在 portlet 环境中实现 MVC。

Web-Socket 模块

为 WebSocket连接 提供支持。

其他模块

AOP 模块

提供了面向切面的编程实现,允许开发者通过定义方法拦截器及切入点对代码进行无耦合集成,它实现了关注点分离。

Aspects 模块

提供了与 AspectJ 的集成,这是一个功能强大且成熟的面向切面编程(AOP)框架。

Instrumentation 模块

实现instrumentation支持,一般用以应用服务器的监测。

Messaging 模块

为STOMP 提供了支持,STOMP协议是一种简单的文本定向消息协议,是 WebSocket 的子协议。

测试

支持 JUnit 、TestNG 框架的集成


三、基础工程

后续的工作将基于样例工程展开,首先需要准备JDK、Java IDE如Eclipse、Maven环境,此类工作较为简单,在此不作赘述。

  1. 创建Maven项目;
  2. 配置Spring依赖;
<dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-context</artifactId>

    <version>4.3.2.RELEASE</version>

</dependency>

 

    3. 编写配置文件及测试代码;

core-beans.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-3.0.xsd">

    <bean id="randomID" class="org.springfoo.core.bean.RandomID" scope="prototype" 
    init-method="init" destroy-method="destroy">
    </bean>

    <bean id="message" class="org.springfoo.core.bean.Message" scope="prototype">
        <property name="content" value="Hello sam" />
        <property name="sender" value="bob" />
        <property name="reciever" value="sam" />
    </bean>
</beans>
 

POJO定义

public class Message {

    private String content;

    private String sender;

    private String reciever;

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
    ...

 

测试代码

private static void tryAppContext() {
    ApplicationContext context = new ClassPathXmlApplicationContext("core-beans.xml");

    Message message = context.getBean(Message.class);
    System.out.println(message);
}

 


四、IOC 容器

IOC 即控制反转,将对象的生命周期管理、关系依赖通过容器实现,实现解耦。

ApplicationContext是最关键的入口,其包括几种实现:

  1. FileSystemXmlApplicationContext,从 XML 文件中加载被定义的 bean对象,基于文件系统路径加载配置;

  2. ClassPathXmlApplicationContext,从 XML 文件中加载被定义的 bean对象,基于类路径加载配置;

  3. WebXmlApplicationContext,从 XML 文件中加载被定义的 bean对象,基于 web 应用程序范围加载配置;

五、Bean 管理

5.1 作用域

singleton

每一个 Spring IoC 容器中保持一个单一实例(默认)。

prototype

bean 的实例可为任意数量。

request

该作用域将 bean 的定义限制为 HTTP 请求。只在 web-aware Spring ApplicationContext 的上下文中有效。

session

该作用域将 bean 的定义限制为 HTTP 会话。 只在web-aware Spring ApplicationContext的上下文中有效。

global-session

该作用域将 bean 的定义限制为全局 HTTP 会话。只在 web-aware Spring ApplicationContext 的上下文中有效。

5.2 生命周期

Bean 的初始化及销毁对应 init 及 destroy 两个行为,可通过实现 InitializingBean/DisposableBean 接口观察对象的初始化及销毁时机。

代码片段:

public void afterPropertiesSet() throws Exception {
    System.out.println(this + "-- properties set");
}

public void init() {
    System.out.println(this + "-- init");
}

public void destroy() {
    System.out.println(this + "-- destroy"); }

 

为了使spring获得 destroy 行为的监视机会,需要注册JVM关闭回调:

context.registerShutdownHook();

 

init/destroy拦截

实现 BeanPostProcessor 接口,并注册到配置文件

<bean class="xxx.MyBeanPostProcessor" />

 

5.3 bean模板

通常可将一组属性归集为bean模板以实现复用

<!-- template -->
<bean id="template" abstract="true">
    <property name="support" value="true" />
    <property name="count" value="10" />
</bean>

<bean id="tplbean" class="org.springfoo.core.bean.TplBean" parent="template">
    <property name="message" value="I'm inheritted from template" />
</bean>

POJO 定义

public class TplBean {

    private String message;
    private boolean support;
    private Integer count;
    ...

 


六、依赖注入

6.1 简单例子

  1. People 包含 Hand/Foot/Body;

  2. Hand/Foot 通过构造参数注入;

  3. Body通过属性参数注入;

beans.xml

<bean id="people" class="org.springfoo.di.bean.People" scope="prototype">
    <constructor-arg ref="foot"/>
    <constructor-arg ref="hand"/>

    <property name="body" ref="body"/>
</bean>


<bean id="foot" class="org.springfoo.di.bean.Foot" scope="prototype">
    <property name="label" value="FOOT" />
</bean>
<bean id="hand" class="org.springfoo.di.bean.Hand" scope="prototype">
    <property name="label" value="HAND" />
</bean>
<bean id="body" class="org.springfoo.di.bean.Body" scope="prototype">
    <property name="label" value="BODY---BB" />
</bean>
 

People.java

public class People {

    private Foot foot;
    private Hand hand;

    private Body body;

    public People(){

    }

    public People(Foot foot, Hand hand) {
    super();
    this.foot = foot;
    this.hand = hand;
    }

    public Foot getFoot() {
        return foot;
    }

    public void setFoot(Foot foot) {
        this.foot = foot;
    }

    public Hand getHand() {
        return hand;
    }

    ...

 

其余略

6.2 注入集合

可通过配置一组值的方式实现集合注入

集合POJO 

@SuppressWarnings("rawtypes")
public class CollectionBean {

private List list;
private Set set;
private Map map;
private Properties prop;

public List getList() {
    return list;
}

public void setList(List list) {
    this.list = list;
}

public Set getSet() {
    return set;
}

public void setSet(Set set) {
    this.set = set;
}

public Map getMap() {
    return map;
}

public void setMap(Map map) {
    this.map = map;
}

public Properties getProp() {
    return prop;
}

public void setProp(Properties prop) {
    this.prop = prop;
}

}

 

beans.xml

<bean id="collection" class="org.springfoo.di.bean.CollectionBean">

    <property name="list">
        <list>
            <value>APPLE</value>
            <value>ORANGE</value>
            <value>PINAPPLE</value>
        </list>
    </property>

    <property name="set">
        <set>
            <value>TABLE</value>
            <value>CHAIR</value>
        </set>
    </property>

    <property name="map">
        <map>
            <entry key="b" value="BEER" />
            <entry key="j" value="JUICE" />
        </map>
    </property>

    <property name="prop">
        <props>
            <prop key="sp">Single Player</prop>
            <prop key="tp">Two Player</prop>
        </props>
    </property>
</bean>

 

6.3 自动装配

POJO定义

public class AutoWireBean {

    private String message;
    private Body body;

    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public Body getBody() {
        return body;
    }
    public void setBody(Body body) {
        this.body = body;
    }
}

 

beans.xml

<bean id="autowire" class="org.springfoo.di.bean.AutoWireBean"
 autowire="byName" scope="prototype">

    <property name="message" value="okok autowire going..."/>

</bean>

 

autowire类型

  1. byName, 通过属性名称与配置中bean名称配对
  2. byType, 通过属性类型与配置中bean类型配对
  3. constructor, 通过构造函数中bean类型配对

 

七、总结

至此,关于 spring 的核心概念已经介绍完毕,接下来就是如何在实践中深化了。

相信只要理解了基础理念,在后续的项目中自然会得心应手,毕竟万变不离其宗。

img_9b09a36f6de95886f52ce82fa1e89c88.jpe

作者: zale

出处: http://www.cnblogs.com/littleatp/, 如果喜欢我的文章,请关注我的公众号

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 原文链接  如有问题, 可留言咨询.

目录
相关文章
|
3月前
|
开发框架 负载均衡 Java
当热门技术负载均衡遇上 Spring Boot,开发者的梦想与挑战在此碰撞,你准备好了吗?
【8月更文挑战第29天】在互联网应用开发中,负载均衡至关重要,可避免单服务器过载导致性能下降或崩溃。Spring Boot 作为流行框架,提供了强大的负载均衡支持,通过合理分配请求至多台服务器,提升系统可用性与可靠性,优化资源利用。本文通过示例展示了如何在 Spring Boot 中配置负载均衡,包括添加依赖、创建负载均衡的 `RestTemplate` 实例及服务接口调用等步骤,帮助开发者构建高效、稳定的应用。随着业务扩展,掌握负载均衡技术将愈发关键。
66 6
|
18天前
|
存储 Java API
简单两步,Spring Boot 写死的定时任务也能动态设置:技术干货分享
【10月更文挑战第4天】在Spring Boot开发中,定时任务通常通过@Scheduled注解来实现,这种方式简单直接,但存在一个显著的限制:任务的执行时间或频率在编译时就已经确定,无法在运行时动态调整。然而,在实际工作中,我们往往需要根据业务需求或外部条件的变化来动态调整定时任务的执行计划。本文将分享一个简单两步的解决方案,让你的Spring Boot应用中的定时任务也能动态设置,从而满足更灵活的业务需求。
58 4
|
2月前
|
存储 缓存 Java
在Spring Boot中使用缓存的技术解析
通过利用Spring Boot中的缓存支持,开发者可以轻松地实现高效和可扩展的缓存策略,进而提升应用的性能和用户体验。Spring Boot的声明式缓存抽象和对多种缓存技术的支持,使得集成和使用缓存变得前所未有的简单。无论是在开发新应用还是优化现有应用,合理地使用缓存都是提高性能的有效手段。
31 1
|
2月前
|
前端开发 安全 Java
技术进阶:使用Spring MVC构建适应未来的响应式Web应用
【9月更文挑战第2天】随着移动设备的普及,响应式设计至关重要。Spring MVC作为强大的Java Web框架,助力开发者创建适应多屏的应用。本文推荐使用Thymeleaf整合视图,通过简洁的HTML代码提高前端灵活性;采用`@ResponseBody`与`Callable`实现异步处理,优化应用响应速度;运用`@ControllerAdvice`统一异常管理,保持代码整洁;借助Jackson简化JSON处理;利用Spring Security增强安全性;并强调测试的重要性。遵循这些实践,将大幅提升开发效率和应用质量。
61 7
|
3月前
|
缓存 NoSQL Java
SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)
Spring Cache 是 Spring 提供的简易缓存方案,支持本地与 Redis 缓存。通过添加 `spring-boot-starter-data-redis` 和 `spring-boot-starter-cache` 依赖,并使用 `@EnableCaching` 开启缓存功能。JetCache 由阿里开源,功能更丰富,支持多级缓存和异步 API,通过引入 `jetcache-starter-redis` 依赖并配置 YAML 文件启用。Layering Cache 则提供分层缓存机制,需引入 `layering-cache-starter` 依赖并使用特定注解实现缓存逻辑。
672 1
SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)
|
3月前
|
XML Java 数据库
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
这篇文章是Spring5框架的实战教程,详细介绍了事务的概念、ACID特性、事务操作的场景,并通过实际的银行转账示例,演示了Spring框架中声明式事务管理的实现,包括使用注解和XML配置两种方式,以及如何配置事务参数来控制事务的行为。
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
|
2月前
|
JavaScript 前端开发 Java
【颠覆传统】Spring框架如何用WebSocket技术重塑实时通信格局?揭秘背后的故事与技术细节!
【9月更文挑战第4天】随着Web应用对实时交互需求的增长,传统的HTTP模型已无法满足现代应用的要求,特别是在需要持续、双向通信的场景下。WebSocket协议由此诞生,提供全双工通信渠道,使服务器与客户端能实时互发消息。作为Java开发中最受欢迎的框架之一,Spring通过其WebSocket模块支持这一协议,简化了WebSocket在Spring应用中的集成。
50 0
|
3月前
|
前端开发 Java Spring
Spring与Angular/React/Vue:当后端大佬遇上前端三杰,会擦出怎样的火花?一场技术的盛宴,你准备好了吗?
【8月更文挑战第31天】Spring框架与Angular、React、Vue等前端框架的集成是现代Web应用开发的核心。通过RESTful API、WebSocket及GraphQL等方式,Spring能与前端框架高效互动,提供快速且功能丰富的应用。RESTful API简单有效,适用于基本数据交互;WebSocket支持实时通信,适合聊天应用和数据监控;GraphQL则提供更精确的数据查询能力。开发者可根据需求选择合适的集成方式,提升用户体验和应用功能。
83 0
|
3月前
|
Java 数据库连接 数据库
告别繁琐 SQL!Hibernate 入门指南带你轻松玩转 ORM,解锁高效数据库操作新姿势
【8月更文挑战第31天】Hibernate 是一款流行的 Java 持久层框架,简化了对象关系映射(ORM)过程,使开发者能以面向对象的方式进行数据持久化操作而无需直接编写 SQL 语句。本文提供 Hibernate 入门指南,介绍核心概念及示例代码,涵盖依赖引入、配置文件设置、实体类定义、工具类构建及基本 CRUD 操作。通过学习,你将掌握使用 Hibernate 简化数据持久化的技巧,为实际项目应用打下基础。
126 0
|
3月前
|
Java 前端开发 Spring
技术融合新潮流!Vaadin携手Spring Boot、React、Angular,引领Web开发变革,你准备好了吗?
【8月更文挑战第31天】本文探讨了Vaadin与Spring Boot、React及Angular等主流技术栈的最佳融合实践。Vaadin作为现代Java Web框架,与其他技术栈结合能更好地满足复杂应用需求。文中通过示例代码展示了如何在Spring Boot项目中集成Vaadin,以及如何在Vaadin项目中使用React和Angular组件,充分发挥各技术栈的优势,提升开发效率和用户体验。开发者可根据具体需求选择合适的技术组合。
54 0