尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Spring概述与核心概念学习 -- Spring入门(一)

Spring概述与核心概念学习 -- Spring入门(一) 文章目录*前言* 发现宝藏* 一、Spring是什么* * 1.概述 * 2.了解spring家族 * 3.spring系统概述 * 4.spring优点 * 5.spring学习路线* 二、入门spring* * 1.核心概念 * 2.IOC入门案例 * 3.DI入门案例 * 4.bean的配置 * 5.IOC容器相关* 三、数据源对象管理* * 1. 数据源对象管理入门案例 * 2. 加载properties配置文件* 总结* *前言–为了巩固所学的知识作者尝试着开始发布一些学习笔记类的博客方便日后回顾。当然如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚文章中如果有记录错误欢迎读者朋友们批评指正。 博客的参考源码以及可以在我主页的资源里找到如果在学习的过程中有什么疑问欢迎大家在评论区向我提出*发现宝藏----前些天发现了一个巨牛的人工智能学习网站通俗易懂风趣幽默忍不住分享一下给大家。【宝藏入口】。一、Spring是什么------------### 1.概述Spring Framework 是一个功能强大的 Java 应用程序框架旨在提供高效且可扩展的开发环境。* 它结合了轻量级的容器IOC和依赖注入(DI)功能提供了一种使用 POJO 进行容器配置和面向切面的编程的简单方法以及一组用于AOP(切面编程)的模块。* Spring 框架还支持各种移动应用开发技术如 Android 和 iOS。此外它还提供了对事务管理、对象/关系映射、JavaBeans、JDBC、JMS 和其他技术的支持从而确保高效开发。### 2.了解spring家族### 3.spring系统概述Spring 有可能成为所有企业应用程序的一站式服务点然而Spring 是模块化的允许你挑选和选择适用于你的模块不必要把剩余部分也引入。下面的部分对在 Spring 框架中所有可用的模块给出了详细的介绍。Spring 框架提供约 20 个模块可以根据应用程序的要求来使用。1. 核心容器(Core Container)核心容器由 spring-corespring-beansspring-contextspring-context-support和spring-expressionSpELSpring 表达式语言Spring Expression Language等模块组成它们的细节如下 spring-core 模块提供了框架的基本组成部分包括 IoC 和依赖注入功能。 spring-beans 模块提供 BeanFactory工厂模式的微妙实现它移除了编码式单例的需要并且可以把配置和依赖从实际编码逻辑中解耦。 context 模块建立在由 core和 beans 模块的基础上建立起来的它以一种类似于 JNDI 注册的方式访问对象。Context 模块继承自 Bean 模块并且添加了国际化比如使用资源束、事件传播、资源加载和透明地创建上下文比如通过 Servelet 容器等功能。Context 模块也支持 Java EE 的功能比如 EJB、JMX 和远程调用等。ApplicationContext 接口是 Context 模块的焦点。spring-context-support 提供了对第三方集成到 Spring 上下文的支持比如缓存EhCache, Guava, JCache、邮件JavaMail、调度CommonJ, Quartz、模板引擎FreeMarker, JasperReports, Velocity等。 spring-expression 模块提供了强大的表达式语言用于在运行时查询和操作对象图。它是 JSP2.1 规范中定义的统一表达式语言的扩展支持 set 和 get 属性值、属性赋值、方法调用、访问数组集合及索引的内容、逻辑算术运算、命名变量、通过名字从 Spring IoC 容器检索对象还支持列表的投影、选择以及聚合等。 2. 数据访问/集成(Data Access/Integration) 数据访问/集成层包括 JDBCORMOXMJMS 和事务处理模块它们的细节如下注JDBCJava Data Base ConnectivityORMObject Relational MappingOXMObject XML MappingJMSJava Message Service JDBC 模块提供了 JDBC 抽象层它消除了冗长的 JDBC 编码和对数据库供应商特定错误代码的解析。 ORM 模块提供了对流行的对象关系映射 API 的集成包括 JPA、JDO 和 Hibernate 等。通过此模块可以让这些 ORM 框架和 spring的其它功能整合比如前面提及的事务管理。 OXM 模块提供了对 OXM 实现的支持比如 JAXB、Castor、XML Beans、JiBX、XStream 等。 JMS 模块包含生产produce和消费consume消息的功能。从 Spring 4.1 开始集成了 spring-messaging 模块。 事务模块为实现特殊接口类及所有的 POJO 支持编程式和声明式事务管理。注编程式事务需要自己写 beginTransaction()、commit()、rollback() 等事务管理方法声明式事务是通过注解或配置由 spring 自动处理编程式事务粒度更细 3.WebWeb 层由 WebWeb-MVCWeb-Socket 和 Web-Portlet 组成它们的细节如下 Web 模块提供面向 web 的基本功能和面向 web 的应用上下文比如多部分multipart文件上传功能、使用 Servlet 监听器初始化 IoC 容器等。它还包括 HTTP 客户端以及 Spring 远程调用中与 web 相关的部分。 Web-MVC 模块为 web 应用提供了模型视图控制MVC和 REST Web服务的实现。Spring 的 MVC 框架可以使领域模型代码和 web 表单完全地分离且可以与 Spring 框架的其它所有功能进行集成。 Web-Socket 模块为 WebSocket-based 提供了支持而且在 web 应用程序中提供了客户端和服务器端之间通信的两种方式。 Web-Portlet 模块提供了用于 Portlet 环境的 MVC 实现并反映了 spring-webmvc 模块的功能。 4.Test模块Test 模块Spring 支持 Junit 和 TestNG 测试框架而且还额外提供了一些基于 Spring 的测试功能比如在测试 Web 框架时模拟 Http 请求的功能。5. 其他还有其他一些重要的模块像 AOPAspectsInstrumentationWeb 和测试模块它们的细节如下 AOP 模块提供了面向方面切面的编程实现允许你定义方法拦截器和切入点对代码进行干净地解耦从而使实现功能的代码彻底的解耦出来。使用源码级的元数据可以用类似于.Net属性的方式合并行为信息到代码中。 Aspects 模块提供了与 AspectJ 的集成这是一个功能强大且成熟的面向切面编程AOP框架。 Instrumentation 模块在一定的应用服务器中提供了类 instrumentation 的支持和类加载器的实现。 Messaging 模块为 STOMP 提供了支持作为在应用程序中 WebSocket 子协议的使用。它也支持一个注解编程模型它是为了选路和处理来自 WebSocket 客户端的 STOMP 信息。 测试模块支持对具有 JUnit 或 TestNG 框架的 Spring 组件的测试 ### 4.spring优点* 方便解耦简化开发Spring 就是一个大工厂可以将所有对象的创建和依赖关系的维护交给 Spring 管理* 方便集成各种优秀框架Spring 不排斥各种优秀的开源框架其内部提供了对各种优秀框架如 Struts2、Hibernate、MyBatis 等的直接支持* 降低 Java EE API 的使用难度Spring 对 Java EE 开发中非常难用的一些 APIJDBC、JavaMail、远程调用等都提供了封装使这些 API 应用的难度大大降低* 方便程序的测试Spring 支持 JUnit4可以通过注解方便地测试 Spring 程序* AOP 编程的支持Spring 提供面向切面编程可以方便地实现对程序进行权限拦截和运行监控等功能* 声明式事务的支持只需要通过配置就可以完成对事务的管理而无须手动编程。### 5.spring学习路线二、入门spring----------### 1.核心概念1. 依赖注入DI* Spring 最认同的技术是控制反转的依赖注入DI模式。控制反转IoC是一个通用的概念它可以用许多不同的方式去表达依赖注入仅仅是控制反转的一个具体的例子。 * 当编写一个复杂的 Java 应用程序时应用程序类应该尽可能的独立于其他的 Java 类来增加这些类可重用可能性当进行单元测试时可以使它们独立于其他类进行测试。依赖注入或者有时被称为配线有助于将这些类粘合在一起并且在同一时间让它们保持独立。 * 到底什么是依赖注入让我们将这两个词分开来看一看。这里将依赖关系部分转化为两个类之间的关联。例如类 A 依赖于类 B。现在让我们看一看第二部分注入。所有这一切都意味着类 B 将通过 IoC 被注入到类 A 中。 * 依赖注入可以以向构造函数传递参数的方式发生或者通过使用 setter 方法 post-construction。由于依赖注入是 Spring 框架的核心部分所以我将在一个单独的章节中利用很好的例子去解释这一概念。 2.面向切面的程序设计AOP* Spring 框架的一个关键组件是面向切面的程序设计AOP框架。一个程序中跨越多个点的功能被称为横切关注点这些横切关注点在概念上独立于应用程序的业务逻辑。有各种各样常见的很好的关于方面的例子比如日志记录、声明性事务、安全性和缓存等等。 * 在 OOP 中模块化的关键单元是类而在 AOP 中模块化的关键单元是方面。AOP 帮助你将横切关注点从它们所影响的对象中分离出来然而依赖注入帮助你将你的应用程序对象从彼此中分离出来。 * Spring 框架的 AOP 模块提供了面向方面的程序设计实现可以定义诸如方法拦截器和切入点等从而使实现功能的代码彻底的解耦出来。使用源码级的元数据可以用类似于 .Net 属性的方式合并行为信息到代码中。我将在一个独立的章节中讨论更多关于 Spring AOP 的概念。 3. SpringIoC 容器* Spring 容器是 Spring 框架的核心。容器将创建对象把它们连接在一起配置它们并管理他们的整个生命周期从创建到销毁。Spring 容器使用依赖注入DI来管理组成一个应用程序的组件。这些对象被称为 Spring Beans * 通过阅读配置元数据提供的指令容器知道对哪些对象进行实例化配置和组装。配置元数据可以通过 XMLJava 注释或 Java 代码来表示。下图是 Spring 如何工作的高级视图。 Spring IoC 容器利用 Java 的 POJO 类和配置元数据来生成完全配置和可执行的系统或应用程序* IOC 容器具有依赖注入功能的容器它可以创建对象IOC 容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。通常new一个实例控制权由程序员控制而控制反转是指new实例工作不由程序员来做而是交给Spring容器来做。在Spring中BeanFactory是IOC容器的实际代表者。 * Spring 提供了以下两种不同类型的容器。 序号容器 描述1Spring BeanFactory 容器它是最简单的容器给 DI 提供了基本的支持它用 org.springframework.beans.factory.BeanFactory 接口来定义。BeanFactory 或者相关的接口如 BeanFactoryAwareInitializingBeanDisposableBean在 Spring 中仍然存在具有大量的与 Spring 整合的第三方框架的反向兼容性的目的。2Spring ApplicationContext 容器该容器添加了更多的企业特定的功能例如从一个属性文件中解析文本信息的能力发布应用程序事件给感兴趣的事件监听器的能力。该容器是由 org.springframework.context.ApplicationContext 接口定义。ApplicationContext 容器包括 BeanFactory 容器的所有功能所以通常不建议使用BeanFactory。BeanFactory 仍然可以用于轻量级的应用程序如移动设备或基于 applet 的应用程序其中它的数据量和速度是显著。4. SpringBean定义* 被称作 bean 的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的。bean 是一个被实例化组装并通过 Spring IoC 容器所管理的对象。这些 bean 是由用容器提供的配置元数据创建的例如已经在先前章节看到的在 XML 的表单中的 定义。 * bean 定义包含称为配置元数据的信息下述容器也需要知道配置元数据 * 如何创建一个 bean * bean 的生命周期的详细信息 * bean 的依赖关系 上述所有的配置元数据转换成一组构成每个 bean 定义的下列属性。属性描述class这个属性是强制性的并且指定用来创建 bean 的 bean 类。name这个属性指定唯一的 bean 标识符。在基于 XML 的配置元数据中你可以使用 ID 和/或 name 属性来指定 bean 标识符。scope这个属性指定由特定的 bean 定义创建的对象的作用域它将会在 bean 作用域的章节中进行讨论。constructor-arg它是用来注入依赖关系的并会在接下来的章节中进行讨论。properties它是用来注入依赖关系的并会在接下来的章节中进行讨论。autowiring mode它是用来注入依赖关系的并会在接下来的章节中进行讨论。lazy-initialization mode延迟初始化的 bean 告诉 IoC 容器在它第一次被请求时而不是在启动时去创建一个 bean 实例。initialization 方法在 bean 的所有必需的属性被容器设置之后调用回调方法。它将会在 bean 的生命周期章节中进行讨论。destruction 方法当包含该 bean 的容器被销毁时使用回调方法。它将会在 bean 的生命周期章节中进行讨论。* Bean 与 Spring 容器的关系## 5.spring三层架构 A 表现层 web层 MVC是表现层的一个设计模型 B 业务层 service层 C 持久层 dao层 ### 2.IOC入门案例1. 入门案例思路分析2. 创建maven模块3. 编写接口和Dao实现类(此时无spring环境纯JAVA开发)* 模块代码结构* BookDao public interface BookDao { public void save(); } * BookDaoImpl public class BookDaoImpl implements BookDao { public void save() { System.out.println(“book dao save …”); } } * BookService public interface BookService { public void save(); } * BookServiceImpl public class BookServiceImpl implements BookService { private BookDao bookDao new BookDaoImpl(); public void save() { System.out.println(“book service save …”); bookDao.save(); } } * Main public class Main { public static void main(String[] args) { BookService bookService new BookServiceImpl(); bookService.save(); } } * Main类运行结果4. 示例代码解析* 首先写了两个数据层接口 BookDao 和 BookService两个接口中都定义了save()方法* 然后写了两个数据层接口的实现类 BookDaoImpl 和 BookServiceImpl分别实现了save() 方法方法里都要一条输出语句但是两个实现类save方法打印的内容不同* 其中 BookServiceImpl 类中还通过new创建对象的方式调用了 BookDaoImpl的save方法* 最后在Main类中通过new创建对象的方式调用了BookServiceImpl的save方法将两个save()方法中的语句打印了出来5. 在pom.xml中导入spring坐标spring-context org.springframework spring-context 5.2.21.RELEASE 6. 创建spring核心配置文件applicationContext.xmlresources 目录右键 -- new -- XML Configuration File -- Spring Config导入spring坐标后才有对应选项7. 配置Bean(如下) ?xml version1.0 encodingUTF-8? 8. 在org.example下新建一个类Main2 public class Main2 { public static void main(String[] args) { //3.获取IoC容器 ApplicationContext ctx new ClassPathXmlApplicationContext(“applicationContext.xml”); //4.获取bean根据bean配置id获取 //左边是对象右边是接口所以要强转类型 BookDao bookDao (BookDao) ctx.getBean(“bookDao”); bookDao.save(); BookService bookService (BookService) ctx.getBean(“bookService”); bookService.save(); } } * 程序运行结果通过spring创建对象而不是通过new创建对象9. 总结 spring程序的开发步骤### 3.DI入门案例1. 删除BookServiceImpl类中通过new方式创建对象的代码并提供对应的setter方法 package org.example.service.impl; import org.example.dao.BookDao; import org.example.service.BookService; public class BookServiceImpl implements BookService { //5.删除业务层中使用new的方式创建的dao对象 private BookDao bookDao; // private BookDao bookDao new BookDaoImpl(); public void save() { System.out.println(“book service save …”); bookDao.save(); } // 6.提供对应的set方法 public void setBookDao(BookDao bookDao) { this.bookDao bookDao; } } 2. 在全局配置文件applicationContext.xml文件中将BookDao注入到BookService中 ?xml version1.0 encodingUTF-8? 3. 运行结果4. 注意事项name 的值是类的属性值ref的值是id值### 4.bean的配置1. bean的基础配置3. bean的别名设置3. 控制bean的作用范围### 5.IOC容器相关1. 创建容器2. 获取bean的方式3. 容器类层次结构BeanFactory接口创建完毕后所有的bean均为延迟加载三、数据源对象管理---------### 1. 数据源对象管理入门案例1. 导入数据源坐标以druid数据源为例com.alibaba druid 1.1.162. 在核心配置文件中配置管理数据源对象由于第三方技术已经写好注入方式以及具体属性名需要查3. 创建编写模拟配置类App及其运行结果public class App { public static void main(String[] args) { ApplicationContext ctx new ClassPathXmlApplicationContext(“applicationContext.xml”); DataSource dataSource (DataSource) ctx.getBean(“dataSource”); System.out.println(dataSource); } }### 2. 加载properties配置文件1. 在resources目录下创建jdbc.properties文件jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://127.0.0.1:3306/spring_db jdbc.usernameroot jdbc.passwordroot2. 在核心配置类中开启context命名空间3. 使用context空间加载properties文件?xml version1.0 encodingUTF-8? context:property-placeholder location“jdbc.properties” system-properties-mode“NEVER”/4. 将绑定好的properties属性注入到bookdao中通过bookdao中的save方法输出public interface BookDao { public void save(); } public class BookDaoImpl implements BookDao { private String name; public void setName(String name) { this.name name; } public void save() { System.out.println(“book dao save …” name); } }5. 模拟测试类及输出结果6. 小结和拓展总结–欢迎各位留言交流以及批评指正如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞收藏支持一下。 博客的参考源码可以在我主页的资源里找到如果在学习的过程中有什么疑问欢迎大家在评论区向我提出
返回列表