一、初识Spring

1、Spring简介

Spring 是当前主流的 Java Web 开发框架,它是为了解决企业应用开发的复杂性问题而产生 的。 对于一个 Java 开发者来说,掌握 Spring 框架的使用,已是其必备的技能之一。 本章将对 Spring 框架的基础知识进行详细的讲解。

2、什么是Spring?

  • Spring 是由 Rod Johnson 组织和开发的一个分层的 Java SE/EE fu川一stack (一站式)轻量 级开源框架,它以 loC ( Inversion of Control ,控制反转)和 AOP ( Aspect Oriented Programming , 面向切面编程)为内核,使用基本的 JavaBean 来完成以前只可能由 EJB ( Enterprise Java Beans , Java 企业 Bean) 完成的工作,取代了 EJB 的靡肿、 低效的开发模式。
  • Spring 致力于 Java EE 应用各层的解决方案,在表现层它提供了 Spring MVC 以及与 Struts 框架的整合功能;在业务逻辑层可以管理事务、 记录日志等;在持久层可以整合 MyBatis、 Hibernate、 JdbcTemplate 等技术。 因此,可以说 Spring 是企业应用开发很好的"一站式"选 择。 虽然 Spring 贯穿于表现层、 业务逻辑层和持久层,但它并不想取代那些已有的框架,而是 以高度的开放性与它们进行无缝整合

3、Spring框架的优点

Spring 具有简单、可测试和松辑合等特点,从这个角度出发, Spring 不仅可以用于服务器 端开发,也可以应用于任何 Java 应用的开发中。 关于 Spring 框架优点的总结,具体如下。

  • 非侵入式设计
    Spring 是一种非侵入式( non-invasive )框架,它可以使应用程序代码对框架的依赖 、最小化。
  • 方便解耦、 简化开发
    Spring 就是一个大工厂,可以将所有对象的创建和依赖关系的维护工作都交给 Spring 容器 管理,大大地降低了组件之间的搞合性。
  • 支持 AOP
    Spring 提供了对 AOP 的支持,它允许将一些通用任务,如安全、 事务、 曰志等进行集中式 处理,从而提高了程序的复用性。
  • 支持声明式事务处理
    只需要通过配置就可以完成对事务的管理,而无须手动编程。
  • 方便程序的测试
    Spring 提供了对 Junit4 的支持,可以通过注解方便地测试 Spring 程序。
  • 方便集成各种优秀框架
    Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如 Struts、 Hibernate、 MyBatis、 Quartz 等)的直接支持。
  • 降低 Java EE API 的使用难度
    Spring 对 Java EE 开发中非常难用的一些 API (如 JDBC、 JavaMail 等),都提供了封装, 使这些 API 应用难度大大降低

4、体系结构

(1)模块信息


  • Core Container (核心窑器)
    Spring 的核心容器是其他模块建立的基础,它主要由 Beans 模块、 Core 模块、 Context 模 块、 Context-support 模块和 SpEL ( Spring Expression Language , Spring 表达式语言)模块 组成,具体介绍如下。
    • Beans 模块:提供了 BeanFactory,是工厂模式的经典实现, Spring 将管理对象称为 Bean。
    • Core 核心模块:提供了 Spring 框架的基本组成部分,包括 loC 和 DI 功能。
    • Context 上下文模块: 建立在 Core 和 Beans 模块的基础之上,它是访问定义和配置的任 何对象的媒介。 其中 ApplicationContext 接口是上下文模块的焦点。
    • Context-support 模块:提供了对第三方库嵌入 Spring 应用的集成支持,比如缓存 ( EhCache、 Guava、 JCache)、 邮件服务 (JavaMail)、 任务调度( CommonJ、 Quartz) 和模 板引擎( FreeMarker、 JasperReports、 速率)。
    • SpEL 模块:是 Spring 3.0 后新增的模块,它提供了 Spring Expression Language 支持, 是运行时查询和操作对象图的强大的表达式语言。
  • Data Access/lntegration (戴帽访问l集成)
    数据访问/集成层包括 JDBC、 ORM 、 OXM、 JMS 和 Transactions 模块,真体介绍如下。
    • JDBC 模块:提供了一个 JDBC 的抽象层,大幅度地减少了在开发过程中对数据库操作的 编码。
    • ORM 模块:对流行的对象关系映射 API ,包括 JPA、 JDO 和 Hibernate 提供了集成层支持。
    • OXM 模块:提供了一个支持对象/XML 映射的抽象层实现,如 JAXB、 Castor、 XMLBeans、 JiBX 和 XStream。
    • JMS 模块:指 Java 消息传递服务,包含使用和产生信息的特性,自 4. 1 版本后支持与 Spring-message 模块的集成。
    • Transactions 事务模块:支持对实现特殊接口以及所有 POJO 类的编程和声明式的事 务管理。
  • Web
    Spring 的 Web 层包括 WebSocket、 Servlet、 Web 和 Portlet 模块,具体介绍如下。
    • WebSocket 模块: Spring 4.0 以后新增的模块,它提供了 WebSocket 和 SockJS 的实现, 以及对 STOMP 的支持。
    • Servlet 模块:也称为 Spring-webmvc 模块,包含了 Spring 的模型一视图一控制器(MVC) 和 REST Web Services 实现的 Web 应用程序。
    • Web 模块:提供了基本的 Web 开发集成特性,例如: 多文件上传功能、 使用 Servlet 监 听器来初始化 loC 容器以及 Web 应用上下文。
    • Portlet 模块:提供了在 Portlet 环境中使用 MVC 实现,类似 Servlet 模块的功能。
  • 其他模块
    Spring 的其他模块还有 AOP、 Aspects、 Instrumentation 以及 Test 模块,具体介绍如下。
    • AOP 模块:提供了面向切面编程实现,允许定义方法拦截器和切入点,将代码按照功能 进行分离,以降低搞合性。
    • Aspects 模块:提供了与 AspectJ 的集成功能, AspectJ 是一个功能强大且成熟的面向切 面编程 (AOP) 框架。
    • Instrumentation 模块:提供了类工具的支持和类加载器的实现,可以在特定的应用服务器 中使用。
    • Messaging 模块: Spring 4.0 以后新增的模块,它提供了对消息传递体系结构和协议 的支持。
    • Test 模块:提供了对单元测试和集成测试的支持。

(2)各个模块之间的联系


5、IOC与DI

IOC(Inversion of Control)控制反转
A需要B,本身不创建,等待IOC容器创建注入到A中

DI(Dependency Injection)依赖注入
A依赖于B,等待IOC容器创建注入

IOC与DI是一件事的不同说法
可以设计类的创建模式,默认单例模式
IOC与new的区别:IOC是松耦合,new是紧耦合

6、创建简单的Maven工程

创建一个简单的Maven工程——TestSpring
(1)导入依赖jar包
https://mvnrepository.com/
搜索spring context,找到Maven代码坐标,写入pom.xml文件中

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.0.RELEASE</version>
    </dependency>

(2)创建配置文件——在resources下
创建applicationContext.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
        https://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>

(3)在java目录下创建package(test),创建A类与B类

  • A代码
public class A {
    private B b;

    public void setB(B b) {
        this.b = b;
    }
    public void test()
    {
        System.out.println(b);
    }
}

注意:方法名必须set+大写的依赖的类名

  • B不写任何代码
  • applicationContext文件代码:
   <bean id="a" class="com.neuedu.test.A">
      <property name="b" ref="b"></property>
   </bean>
   
   <bean id="b" class="com.neuedu.test.B"></bean>

注意:name:类中的属性名,ref:另一个bean的id
若想创建的类不是单例模式,在a的<bean>中class后面加scope=“prototype”

   <bean id="a" class="com.neuedu.test.A" scope=“prototype”>
      <property name="b" ref="b"></property>
   </bean>

(4)创建TestIOC类对代码测试
首先导入jar包,搜索Junit,导入坐标到pom.xml

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
  • TestIOC代码:
    @Test
    public void test1()
    {
        //1.启动spring的容器
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.从容器获取A对象
        A a = context.getBean(A.class);
        //3.调用a的方法
        a.test();
    }

由以上代码可知,A中并没有new一个B的对象,但是得到了
B,这就是IOC容器创建的对象,然后注入到A里面

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容