凡是过往,皆为序章

0%

Spring_01(Spring入门)

Spring 入门。


Spring 全家桶:spring,springMVC,Spring Boot,Spring Cloud,它们都是框架,负责Java开发的各个方面。先开始学习最基础的Spring。

一、Spring概述

优点:减轻对项目模块的管理,类和类之间的管理,帮助开发人员创建对象,管理对象之间的关系。

Spring核心技术:IOC,AOP。能实现模块之间、类之间的解耦合。

spring是一个开源组织,有很多项目,在官网中可以看到有如下project,每一个project就是一个开源框架。

我们学习的spring框架,就是其中的spring framework。

Spring 优点

  • 轻量:核心功能依赖的jar包少,总共3M左右。且占用资源少。
  • 解耦合:针对接口编程,提供了IOC控制反转,由容器管理对象之间的依赖关系。原来在程序代码中的对象创建方式,现在由容器完成。
  • AOP:进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
  • 方便集成各种优秀的框架:Spring对一些优秀的框架提供了直接的支持。
  • 声明式事务的支持:只需要通过配置就可以完成对事务的管理,而无须手动编程。
  • 方便程序的测试:Spring 支持 JUnit4,可以通过注解方便地测试 Spring 程序。

二、Spring体系结构详解

Spring框架采用分层架构,根据不同的功能被划分成了多个模块,这些模块大体可分为 Data Access/Integration、Web、AOP、Aspects、Messaging、Instrumentation、Core Container 和 Test。

图中包含了 Spring 框架的所有模块,这些模块可以满足一切企业级应用开发的需求,在开发过程中可以根据需求有选择性地使用所需要的模块。下面分别对这些模块的作用进行简单介绍。

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

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

  • JDBC 模块:提供了一个 JDBC 的抽象层,大幅度减少了在开发过程中对数据库操作的编码。
  • ORM 模块:对流行的对象关系映射 API,包括 JPA、JDO、Hibernate 和 iBatis 提供了的集成层。
  • OXM 模块:提供了一个支持对象/XML 映射的抽象层实现,如 JAXB、Castor、XMLBeans、JiBX 和 XStream。
  • JMS 模块:指 Java 消息服务,包含的功能为生产和消费的信息。
  • Transactions 事务模块:支持编程和声明式事务管理实现特殊接口类,并为所有的 POJO。

2. Web 模块

Spring 的 Web 层包括 Web、Servlet、Struts 和 Portlet 组件,具体介绍如下。

  • Web 模块:提供了基本的 Web 开发集成特性,例如多文件上传功能、使用的 Servlet 监听器的 IoC 容器初始化以及 Web 应用上下文。
  • Servlet模块:包括 Spring 模型—视图—控制器(MVC)实现 Web 应用程序。
  • Struts 模块:包含支持类内的 Spring 应用程序,集成了经典的 Struts Web 层。
  • Portlet 模块:提供了在 Portlet 环境中使用 MV C实现,类似 Web-Servlet 模块的功能。

3. Core Container(核心容器)

Spring 的核心容器是其他模块建立的基础,由 Beans 模块、Core 核心模块、Context 上下文模块和 Expression Language 表达式语言模块组成,具体介绍如下。

  • Beans 模块:提供了 BeanFactory,是工厂模式的经典实现,Spring 将管理对象称为 Bean。
  • Core 核心模块:提供了 Spring 框架的基本组成部分,包括 IoC 和 DI 功能。
  • Context 上下文模块:建立在核心和 Beans 模块的基础之上,它是访问定义和配置任何对象的媒介。ApplicationContext 接口是上下文模块的焦点。
  • Expression Language 模块:是运行时查询和操作对象图的强大的表达式语言。

4. 其他模块

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

  • AOP 模块:提供了面向切面编程实现,允许定义方法拦截器和切入点,将代码按照功能进行分离,以降低耦合性。
  • Aspects 模块:提供与 AspectJ 的集成,是一个功能强大且成熟的面向切面编程(AOP)框架。
  • Instrumentation 模块:提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。
  • Test 模块:支持 Spring 组件,使用 JUnit 或 TestNG 框架的测试。

三、Spring IOC 控制反转

控制反转(IoC,Inversion of Control),指将把对象的创建、赋值、管理工作都交给代码之外的容器实现。

控制:创建对象,对象的属性赋值,对象之间的关系管理。

正转:使用new关键字构造方法创建对象,开发人员主动管理对象。

反转:把原来的开发人员管理创建对象的权限转移给代码之外的容器实现,由容器代替开发人员管理对象。

容器:是一个服务器软件,一个框架,Spring就是这样一个框架。

为什么IoC:减少对代码的改动,实现解耦合。

IoC体现

Tomcat作为容器,里面存放着Servlet,Listener,Filter等对象,不用手动创建对象。

IoC技术实现

使用DI(Dependency Injection)实现IoC的功能。

DI:依赖注入,只需要在程序中提供所使用对象的名称就可以由 DI 自动创建,赋值和查找。使用的是反射机制。

四、Spring 的第一个程序

步骤:

1、创建Maven项目,导入spring 的相关依赖

2、创建类(接口类和其实现类),和没有使用框架一样,普通的类。

3、创建spring需要使用的配置文件:声明类的信息,这些类由spring创建和管理。

4、测试对象创建

1、新建Maven工程

导入spring 的 maven依赖。

1
2
3
4
5
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>

2、创建接口和实现类

1
2
3
public interface SomeService {
void doSome();
}
1
2
3
4
5
6
7
8
9
10
public class SomeServiceImpl implements SomeService {
public SomeServiceImpl() {
System.out.println("SomeService 的构造方法执行了");
}

@Override
public void doSome() {
System.out.println("执行了SomeServiceImpl的 doSome() 方法。");
}
}

3、创建配置文件

给Maven项目创建resources资源目录,在该目录下创建spring的xml配置文件,依赖导入成功后,会出现spring xml提示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?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">
<!--
告诉spring创建对象
声明bean,就是告诉spring创建某个类的对象
id:对象的自定义名称,符合Java的命名规则,是唯一的。
class:类的全限定名称(必须是类,不是接口)
-->

<bean id="someService" class="com.thorine.service.impl.SomeServiceImpl" />
<!--
完成 :SomeService service = new SomeServiceImpl();
spring 是把创建好的对象放入map集合中,spring框架有一个map存放对象
springMap.put(id的值, 对象);
例如:springMap.put(someService, new SomeServiceImpl());

注意:一个bean标签声明一个对象,想声明多个对象,就用多个bean标签
-->

<!--表示创建已存在类的对象-->
<bean id="myDate" class="java.util.Date" />
</beans>

4、测试对象创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/*
* spring创建对象的时间:在创建spring的容器时,会创建配置文件中的所有对象
* */
@Test
public void test02() {
// 使用spring容器创建对象
// 指定spring配置文件的名称
String config = "beans.xml";
// 创建表示spring容器的对象,ApplicationContext,就是表示Spring容器,通过容器获取对象

//ClassPathXmlApplicationContext 表示从类路径中加载spring的配置文件
// 执行该语句则创建目标对象,执行SomeService的构造函数
ApplicationContext ac = new ClassPathXmlApplicationContext(config);

// 从容器中获取某个对象,你要调用对象的方法
// getBean("配置文件中的bean的id值")
SomeService service = (SomeService) ac.getBean("someService");

// 使用spring创建好的对象
service.doSome();
}

/*
* 获取spring容器中 java 对象信息
* */
@Test
public void test03(){
String config = "beans.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(config);

// 使用spring提供的方法,获取容器中定义的对象的数量
int count = ac.getBeanDefinitionCount();
System.out.println("容器中定义对象的数量:" + count);

// 容器中每个对象的名称
String[] names = ac.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
}

/*
* 获取一个非自定义类的对象
* */
@Test
public void test04(){
String config = "beans.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(config);

Date myDate = (Date) ac.getBean("myDate");
System.out.println("Date对象:"+myDate);
}

注:

1、什么样的对象放入spring 容器中?

​ (1)dao类,service类,controller类,工具类等(使用xml配置文件 或 注解方法 创建对象)

​ (2)spring中的对象默认都是单例的,在容器中叫这个名称的对象只有一个

2、不放入spring容器中的对象

​ (1)实体类对象,实体类对象来自于数据库

​ (2)servlet、listener、filter等由tomcat创建的对象

~感谢你请我吃糖果~
-------------本文结束,感谢您的阅读,欢迎评论留言!-------------