Java EE之第1章Spring的基本应用

本文详细介绍了Spring框架的基本应用,包括Spring的核心容器BeanFactory和ApplicationContext,以及依赖注入的概念和实现方式。Spring作为轻量级开源框架,以其非侵入式设计和AOP支持,降低了组件间的耦合,简化了Java EE应用的开发。同时,文章讨论了Spring的体系结构,强调了ApplicationContext在初始化时的自检优势,提供了依赖注入的setter方法和构造方法注入的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Spring是当前主流的Java Web开发框架,它是为了解决企业应用开发的复杂性问题而产生的

1.1 Spring概述

Spring是轻量级开源框架,它以IoC(控制反转)和AOP(面向切面编程)为内核,使用基本的JavaBean来完成以前只可能由EJB(Java企业Bean)完成的工作,取代了EJB的臃肿和低效的开发模式

Spring致力于Java EE应用各层的解决方案,在表现层它提供了Spring MVC以及与Struts框架的整合功能;在业务逻辑层可以管理事物,记录日记等;在持久层可以整合MyBatis,Hibernate,JdbcTemplate等技术

Spring是企业应用开发很好的一站式选择,虽然Spring贯穿于表现层,业务逻辑层和持久层,但它并不想取代哪些已有的框架,而是以高度的开放性与它们进行无缝整合

1.1.2 Spring框架的优点

Spring具有简单,可测试和松耦合等特点,从这个角度出发,Spring不仅可以用于服务器端开发,也可以应用于任何Java应用的开发中,具体优点如下:
1.非侵入式设计
Spring是一种非侵入式框架,它可以使应用程序代码对框架的依赖最小化

2.方便解耦,简化开发
Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护工作都交给Spring容器管理,大大地降低了组件之间的耦合性

3.支持AOP
Spring提供了对AOP的支持,它允许将一些通用任务,如安全,事物,日记等进行集中式处理,从而提高了程序的复用性

4.支持声明式事务处理
只需要通过配置就可以完成对事务的管理,而无须手动编程

5.方便程序的测试
Spring提供了对Junit4的支持,可以通过注解方便地测试Spring程序

6.方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架的直接支持

7.降低JavaEE API的使用难度
Spring对Java EE开发中非常难用的一些API,都提供了封装,使用这些API应用难度大大降低

1.1.3 Spring的体系结构

Spring框架采用的分层结构,它一系列的功能要素被分成20个模块,接下来只介绍主要模块如下:
1.Core Container(核心容器)

Spring的核心容器是其他模块建立的基础,它主要由Beans模块,Core模块,Context模块,Context-support模块和SpEL(spring表达式语言)模块组成,具体介绍如下:

(1)Beans模块: 提供了BeanFactory,是工厂模式的经典实现,Spring将管理对象称为Bean

(2)Core核心模块: 提供了Spring框架的基本组成部分,包括IoC和DI功能

(3)Context上下文模块: 建立在Core和Beans模块的基础之上,它是访问定义和配置的任何对象的媒介。其中ApplicationContext接口上下文的焦点

(4)Context-support模块: 提供了对第三方库嵌入Spring应用的集成支持,比如缓存,邮件服务,任务调度和模板引擎(速率)

(5)SpEL(spring表达式语言)模块: 是运行时查询和操作对象图的强大的表达式语言

2.Data Access/Integration(数据访问/集成)

数据访问/集成层包括JDBC,ORM,OXM,JMS和Transactions模块,具体介绍如下:

(1)JDBC模块: 提供了一个JDBC的抽象层,大幅度地减少了在开发过程种对数据库操作的编码

(2)ORM模块: 对流行的对象关系映射API,包括JPA,JDO和Hibernate提供了集成层支持

(3)OXM模块: 提供了一个支持对象/XML映射的抽象层实现,如JAXB,Castor,XMLBeans,JiBX和XStream

(4)JMS模块: 指Java消息传递服务,包含使用和产生信息的特性,自4.1版本后支持与Spring-message模块的集成

(5)Transactions模块: 支持对实现特殊接口以及所有POJO类的编程和声明式的事物管理

3.Web

Spring的Web层包括WebSocket,Servlet,Web和Portlet模块,具体介绍如下:

(1)WebSocket模块: 它提供了WebSocket和SockJS的实现,以及对STOMP的支持

(2)Servlet模块: 也称为Spring-webmvc模块,包含了Spring的模型—视图—控制器(MVC)和REST Web Services实现的Web应用程序

(3)Web模块: 提供了基本的Web开发集成特性,例如:多文件上传功能,使用Servlet监听器来初始化IoC容器以及Web应用上下文

(4)Portlet模块: 提供了在Portlet环境中使用MVC实现,类似Servlet模块的功能

4.其他模块

Spring的其他模板还有AOP,Aspects,Instrumentation以及Test模块,具体介绍如下:

(1)AOP模块: 提供了面向切面编程实现,允许定义方法拦截器和切入点,将代码按照功能进行分离,以降低耦合性

(2)Aspects模块: 提供了与AspectsJ的集成功能,AspectsJ是一个强大且成熟的面向切面编程(APO)框架

(3)Instrumentation模块: 提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用

(4)Test模块: 提供了对单元测试和集成测试的支持

1.2 Spring的核心容器

Spring框架的主要功能是通过其核心容器来实现的。Spring框架提供了两种核心容器,分别为BeanFactory和ApplicationContext具体介绍如下:

1.2.1 BeanFactory

BeanFactory: 是基础类型的IoC容器(控制反转),它提供了完整的IoC服务支持。BeanFactory是一个管理Bean的工厂,它主要负责初始化各种Bean,并调用它们的生命周期方法

1.2.2 ApplicationContext

ApplicationContext: 是BeanFactory的子接口,也被称为应用上下文,是另一种常用的Spring核心容器。不仅包含了BeanFactory的所有功能,还添加对国际化,资源访问,事件传播等方面的支持

创建ApplicationContext接口实例,通常采用两种方法,具体如下:

1.通过ClassPathXmlApplicationContext创建

2.通过FileSystemXmlApplicationContext创建

创建Spring容器后,就可以获取Spring容器中的Bean。Spring获取Bean的实例通常采用以下两种方法:

Object getBeab(String name): 根据容器中Bean的id或name来获取指定的Bean,获取之后需要进行强制类型转换

<T>T getBean(Class<T>requiredType): 根据类的类型来获取Bean的实例。由此方法为泛型方法,因此在获取Bean之后不需要进行强制类型转换

提醒BeanFactory和ApplicationContext两种容器都是通过XML配置文件加载Bean的

两者的主要区别:如果Bean的某一个属性 没有注入,使用BeanFactory加载后,在第一次调用getBean()方法时回抛出异常,而ApplicationContext则在初始化时自检,这样有利于检查所依赖属性是否注入。因此,在实际开发中,通常优先选择使用ApplicationContext,而只有在系统资源较少时,才考虑使用BeanFactory

1.4 依赖注入

依赖注入(简称DI): 与控制反转(IoC)的含义相同,只不过这两个称呼是从两个角度描述的同一个概念。对于一个Spring初学者来说,这两种称呼很难理解,下面将通过简单的语言来描述这两个概念

当某个Java对象(调用者)需要调用另一个Java对象(被调用者,即被依赖对象)时,在传统模式下,调用者通常会采用"new 被调用者"的代码方式来创建对象,这种方式回导致调用者与被调用者之间的耦合性增加,不利于后期项目的升级和维护

控制反转(IoC)角度: 在使用Spring框架之后,对象的实例不再由调用者来创建,而是由Spring容器来创建,Spring容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。这样,控制权由应用代码转移到了Spring容器,控制权发生了反转,这就是Spring的控制反转

依赖注入(DI)角度: 从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,这相当于为调用者注入了它依赖的实例,这就是Spring的依赖注入

控制反转与依赖注入推荐文章:https://www.cnblogs.com/yanggb/p/10337600.html

1.4.2 依赖注入的实现方式

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

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

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

依赖注入推荐文章:

(1)https://www.cnblogs.com/chansblogs/p/8343930.html

(2)https://www.cnblogs.com/sylone/p/9479276.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值