spring 订阅
Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。因此, Spring不仅仅能应用于JEE应用程序之中,也可以应用于桌面应用程序以及小应用程序之中。Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。 [1] 展开全文
Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。因此, Spring不仅仅能应用于JEE应用程序之中,也可以应用于桌面应用程序以及小应用程序之中。Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。 [1]
信息
范    围
Java应用
兴    起
2003年
外文名
Spring
中文名
Spring
功    能
使用基本的JavaBean代替EJB
目    的
解决企业应用开发的复杂性
spring简介
Spring是Java EE编程领域的一个轻量级开源框架,该框架由一个叫Rod Johnson的程序员在 2002 年最早提出并随后创建,是为了解决企业级编程开发中的复杂性,实现敏捷开发的应用型框架 。 [2]  Spring是一个开源容器框架,它集成各类型的工具,通过核心的Bean factory实现了底层的类的实例化和生命周期的管理。在整个框架中,各类型的功能被抽象成一个个的 Bean,这样就可以实现各种功能的管理,包括动态加载和切面编程。 [3]  Spring是独特的,因为若干个原因:它定位的领域是许多其他流行的framework没有的。Spring致力于提供一种方法管理你的业务对象。Spring是全面的和模块化的。Spring有分层的体系结构,这意味着你能选择使用它孤立的任何部分,它的架构仍然是内在稳定的。例如,你可能选择仅仅使用Spring来简单化JDBC的使用,或用来管理所有的业务对象。它的设计从底部帮助你编写易于测试的代码。Spring是用于测试驱动工程的理想的framework。Spring对你的工程来说,它不需要一个以上的framework。Spring是潜在地一站式解决方案,定位于与典型应用相关的大部分基础结构。它也涉及到其他framework没有考虑到的内容。
收起全文
精华内容
下载资源
问答
  • 2021-06-25 21:35:08

    🍅 作者简介:哪吒,CSDN2021博客之星亚军🏆、新星计划导师✌、博客专家💪

    🍅 哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师

    🍅 关注公众号【哪吒编程】,回复1024,获取Java学习路线思维导图、大厂面试真题、加入万粉计划交流群、一起学习进步

    目录

    一、SpringSecurity 框架简介

    二、SpringSecurity与shiro

    更多相关内容
  • 《手撸 Spring》 • 小傅哥.pdf

    千次下载 2021-08-11 16:32:43
    通过带着读者手写简化版 Spring 框架,了解 Spring 核心原理。在手写Spring 源码的过程中会摘取整体框架中的核心逻辑,简化代码实现过程,保留核心功能,例如:IOC、AOP、Bean生命周期、上下文、作用域、资源处理等...
  • Spring Batch是一个轻量级的,完全面向Spring的批处理框架,可以应用于企业级大量的数据处理系统。Spring Batch以POJO和大家熟知的Spring框架为基础,使开发者更容易的访问和利用企业级服务。Spring Batch可以提供...
  • Spring Boot面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 17:48:42
    文章目录概述什么是 Spring Boot?Spring Boot 有哪些优点?Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?配置什么是 JavaConfig?Spring Boot 自动配置原理是什么?你如何理解 Spring Boot 配置加载...

    你是否有为快速开发各种报表而烦恼?遇到类似如下的问题:

    • 表格少的,可以用代码写,几十上百张表格呢,纯手工需要用多少时间?
    • 格式复杂,逻辑复杂的,做起来更是头大
    • 需求总变来变去,修改和维护成本太高
    • 图形自己做不美观,而且工作量巨大
    • 用第三方的相对简单,但集成和学习成本也不小

    从各行业合作伙伴的实际使用情况,证明使用下文说的报表做表格和图形,可以极大的提升效率,节省成本,详情请查看文章:https://thinkwon.blog.csdn.net/article/details/125035932
    文章干货多多,欢迎一键三连,谢谢😊😊

    Java面试总结(2021优化版)已发布在个人微信公众号【技术人成长之路】,优化版首先修正了读者反馈的部分答案存在的错误,同时根据最新面试总结,删除了低频问题,添加了一些常见面试题,对文章进行了精简优化,欢迎大家关注!😊😊

    【技术人成长之路】,助力技术人成长!更多精彩文章第一时间在公众号发布哦!

    文章目录

    Java面试总结汇总,整理了包括Java基础知识,集合容器,并发编程,JVM,常用开源框架Spring,MyBatis,数据库,中间件等,包含了作为一个Java工程师在面试中需要用到或者可能用到的绝大部分知识。欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。文章持续更新中…

    序号内容链接地址
    1Java基础知识面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390612
    2Java集合容器面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588551
    3Java异常面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390689
    4并发编程面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104863992
    5JVM面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390752
    6Spring面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397516
    7Spring MVC面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397427
    8Spring Boot面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397299
    9Spring Cloud面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397367
    10MyBatis面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/101292950
    11Redis面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/103522351
    12MySQL数据库面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104778621
    13消息中间件MQ与RabbitMQ面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588612
    14Dubbo面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390006
    15Linux面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588679
    16Tomcat面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397665
    17ZooKeeper面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397719
    18Netty面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104391081
    19架构设计&分布式&数据结构与算法面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/105870730

    概述

    什么是 Spring Boot?

    Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。

    Spring Boot 有哪些优点?

    Spring Boot 主要有如下优点:

    1. 容易上手,提升开发效率,为 Spring 开发提供一个更快、更广泛的入门体验。
    2. 开箱即用,远离繁琐的配置。
    3. 提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置等。
    4. 没有代码生成,也不需要XML配置。
    5. 避免大量的 Maven 导入和各种版本冲突。

    Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

    启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:

    @SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。

    @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。

    @ComponentScan:Spring组件扫描。

    配置

    什么是 JavaConfig?

    Spring JavaConfig 是 Spring 社区的产品,它提供了配置 Spring IoC 容器的纯Java 方法。因此它有助于避免使用 XML 配置。使用 JavaConfig 的优点在于:

    (1)面向对象的配置。由于配置被定义为 JavaConfig 中的类,因此用户可以充分利用 Java 中的面向对象功能。一个配置类可以继承另一个,重写它的@Bean 方法等。

    (2)减少或消除 XML 配置。基于依赖注入原则的外化配置的好处已被证明。但是,许多开发人员不希望在 XML 和 Java 之间来回切换。JavaConfig 为开发人员提供了一种纯 Java 方法来配置与 XML 配置概念相似的 Spring 容器。从技术角度来讲,只使用 JavaConfig 配置类来配置容器是可行的,但实际上很多人认为将JavaConfig 与 XML 混合匹配是理想的。

    (3)类型安全和重构友好。JavaConfig 提供了一种类型安全的方法来配置 Spring容器。由于 Java 5.0 对泛型的支持,现在可以按类型而不是按名称检索 bean,不需要任何强制转换或基于字符串的查找。

    Spring Boot 自动配置原理是什么?

    注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自动配置的核心,

    @EnableAutoConfiguration 给容器导入META-INF/spring.factories 里定义的自动配置类。

    筛选有效的自动配置类。

    每一个自动配置类结合对应的 xxxProperties.java 读取配置文件进行自动配置功能

    你如何理解 Spring Boot 配置加载顺序?

    在 Spring Boot 里面,可以使用以下几种方式来加载配置。

    1)properties文件;

    2)YAML文件;

    3)系统环境变量;

    4)命令行参数;

    等等……

    什么是 YAML?

    YAML 是一种人类可读的数据序列化语言。它通常用于配置文件。与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML 文件就更加结构化,而且更少混淆。可以看出 YAML 具有分层配置数据。

    YAML 配置的优势在哪里 ?

    YAML 现在可以算是非常流行的一种配置文件格式了,无论是前端还是后端,都可以见到 YAML 配置。那么 YAML 配置和传统的 properties 配置相比到底有哪些优势呢?

    1. 配置有序,在一些特殊的场景下,配置有序很关键
    2. 支持数组,数组中的元素可以是基本数据类型也可以是对象
    3. 简洁

    相比 properties 配置文件,YAML 还有一个缺点,就是不支持 @PropertySource 注解导入自定义的 YAML 配置。

    Spring Boot 是否可以使用 XML 配置 ?

    Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过 @ImportResource 注解可以引入一个 XML 配置。

    spring boot 核心配置文件是什么?bootstrap.properties 和 application.properties 有何区别 ?

    单纯做 Spring Boot 开发,可能不太容易遇到 bootstrap.properties 配置文件,但是在结合 Spring Cloud 时,这个配置就会经常遇到了,特别是在需要加载一些远程配置文件的时侯。

    spring boot 核心的两个配置文件:

    • bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 加载的,比 applicaton 优先加载,配置在应用程序上下文的引导阶段生效。一般来说我们在 Spring Cloud Config 或者 Nacos 中会用到它。且 boostrap 里面的属性不能被覆盖;
    • application (. yml 或者 . properties): 由ApplicatonContext 加载,用于 spring boot 项目的自动化配置。

    什么是 Spring Profiles?

    Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册 bean。因此,当应用程序在开发中运行时,只有某些 bean 可以加载,而在 PRODUCTION中,某些其他 bean 可以加载。假设我们的要求是 Swagger 文档仅适用于 QA 环境,并且禁用所有其他文档。这可以使用配置文件来完成。Spring Boot 使得使用配置文件非常简单。

    如何在自定义端口上运行 Spring Boot 应用程序?

    为了在自定义端口上运行 Spring Boot 应用程序,您可以在application.properties 中指定端口。server.port = 8090

    安全

    如何实现 Spring Boot 应用程序的安全性?

    为了实现 Spring Boot 的安全性,我们使用 spring-boot-starter-security 依赖项,并且必须添加安全配置。它只需要很少的代码。配置类将必须扩展WebSecurityConfigurerAdapter 并覆盖其方法。

    比较一下 Spring Security 和 Shiro 各自的优缺点 ?

    由于 Spring Boot 官方提供了大量的非常方便的开箱即用的 Starter ,包括 Spring Security 的 Starter ,使得在 Spring Boot 中使用 Spring Security 变得更加容易,甚至只需要添加一个依赖就可以保护所有的接口,所以,如果是 Spring Boot 项目,一般选择 Spring Security 。当然这只是一个建议的组合,单纯从技术上来说,无论怎么组合,都是没有问题的。Shiro 和 Spring Security 相比,主要有如下一些特点:

    1. Spring Security 是一个重量级的安全管理框架;Shiro 则是一个轻量级的安全管理框架
    2. Spring Security 概念复杂,配置繁琐;Shiro 概念简单、配置简单
    3. Spring Security 功能强大;Shiro 功能简单

    Spring Boot 中如何解决跨域问题 ?

    跨域可以在前端通过 JSONP 来解决,但是 JSONP 只可以发送 GET 请求,无法发送其他类型的请求,在 RESTful 风格的应用中,就显得非常鸡肋,因此我们推荐在后端通过 (CORS,Cross-origin resource sharing) 来解决跨域问题。这种解决方案并非 Spring Boot 特有的,在传统的 SSM 框架中,就可以通过 CORS 来解决跨域问题,只不过之前我们是在 XML 文件中配置 CORS ,现在可以通过实现WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题。

    @Configuration
    public class CorsConfig implements WebMvcConfigurer {
    
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins("*")
                    .allowCredentials(true)
                    .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                    .maxAge(3600);
        }
    
    }
    

    项目中前后端分离部署,所以需要解决跨域的问题。
    我们使用cookie存放用户登录的信息,在spring拦截器进行权限控制,当权限不符合时,直接返回给用户固定的json结果。
    当用户登录以后,正常使用;当用户退出登录状态时或者token过期时,由于拦截器和跨域的顺序有问题,出现了跨域的现象。
    我们知道一个http请求,先走filter,到达servlet后才进行拦截器的处理,如果我们把cors放在filter里,就可以优先于权限拦截器执行。

    @Configuration
    public class CorsConfig {
    
        @Bean
        public CorsFilter corsFilter() {
            CorsConfiguration corsConfiguration = new CorsConfiguration();
            corsConfiguration.addAllowedOrigin("*");
            corsConfiguration.addAllowedHeader("*");
            corsConfiguration.addAllowedMethod("*");
            corsConfiguration.setAllowCredentials(true);
            UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
            urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
            return new CorsFilter(urlBasedCorsConfigurationSource);
        }
    
    }
    

    什么是 CSRF 攻击?

    CSRF 代表跨站请求伪造。这是一种攻击,迫使最终用户在当前通过身份验证的Web 应用程序上执行不需要的操作。CSRF 攻击专门针对状态改变请求,而不是数据窃取,因为攻击者无法查看对伪造请求的响应。

    监视器

    Spring Boot 中的监视器是什么?

    Spring boot actuator 是 spring 启动框架中的重要功能之一。Spring boot 监视器可帮助您访问生产环境中正在运行的应用程序的当前状态。有几个指标必须在生产环境中进行检查和监控。即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组可直接作为 HTTP URL 访问的REST 端点来检查状态。

    如何在 Spring Boot 中禁用 Actuator 端点安全性?

    默认情况下,所有敏感的 HTTP 端点都是安全的,只有具有 ACTUATOR 角色的用户才能访问它们。安全性是使用标准的 HttpServletRequest.isUserInRole 方法实施的。 我们可以使用来禁用安全性。只有在执行机构端点在防火墙后访问时,才建议禁用安全性。

    我们如何监视所有 Spring Boot 微服务?

    Spring Boot 提供监视器端点以监控各个微服务的度量。这些端点对于获取有关应用程序的信息(如它们是否已启动)以及它们的组件(如数据库等)是否正常运行很有帮助。但是,使用监视器的一个主要缺点或困难是,我们必须单独打开应用程序的知识点以了解其状态或健康状况。想象一下涉及 50 个应用程序的微服务,管理员将不得不击中所有 50 个应用程序的执行终端。为了帮助我们处理这种情况,我们将使用位于的开源项目。 它建立在 Spring Boot Actuator 之上,它提供了一个 Web UI,使我们能够可视化多个应用程序的度量。

    整合第三方项目

    什么是 WebSockets?

    WebSocket 是一种计算机通信协议,通过单个 TCP 连接提供全双工通信信道。

    1、WebSocket 是双向的 -使用 WebSocket 客户端或服务器可以发起消息发送。

    2、WebSocket 是全双工的 -客户端和服务器通信是相互独立的。

    3、单个 TCP 连接 -初始连接使用 HTTP,然后将此连接升级到基于套接字的连接。然后这个单一连接用于所有未来的通信

    4、Light -与 http 相比,WebSocket 消息数据交换要轻得多。

    什么是 Spring Data ?

    Spring Data 是 Spring 的一个子项目。用于简化数据库访问,支持NoSQL 和 关系数据存储。其主要目标是使数据库的访问变得方便快捷。Spring Data 具有如下特点:

    SpringData 项目支持 NoSQL 存储:

    1. MongoDB (文档数据库)
    2. Neo4j(图形数据库)
    3. Redis(键/值存储)
    4. Hbase(列族数据库)

    SpringData 项目所支持的关系数据存储技术:

    1. JDBC
    2. JPA

    Spring Data Jpa 致力于减少数据访问层 (DAO) 的开发量. 开发者唯一要做的,就是声明持久层的接口,其他都交给 Spring Data JPA 来帮你完成!Spring Data JPA 通过规范方法的名字,根据符合规范的名字来确定方法需要实现什么样的逻辑。

    什么是 Spring Batch?

    Spring Boot Batch 提供可重用的函数,这些函数在处理大量记录时非常重要,包括日志/跟踪,事务管理,作业处理统计信息,作业重新启动,跳过和资源管理。它还提供了更先进的技术服务和功能,通过优化和分区技术,可以实现极高批量和高性能批处理作业。简单以及复杂的大批量批处理作业可以高度可扩展的方式利用框架处理重要大量的信息。

    什么是 FreeMarker 模板?

    FreeMarker 是一个基于 Java 的模板引擎,最初专注于使用 MVC 软件架构进行动态网页生成。使用 Freemarker 的主要优点是表示层和业务层的完全分离。程序员可以处理应用程序代码,而设计人员可以处理 html 页面设计。最后使用freemarker 可以将这些结合起来,给出最终的输出页面。

    如何集成 Spring Boot 和 ActiveMQ?

    对于集成 Spring Boot 和 ActiveMQ,我们使用依赖关系。 它只需要很少的配置,并且不需要样板代码。

    什么是 Apache Kafka?

    Apache Kafka 是一个分布式发布 - 订阅消息系统。它是一个可扩展的,容错的发布 - 订阅消息系统,它使我们能够构建分布式应用程序。这是一个 Apache 顶级项目。Kafka 适合离线和在线消息消费。

    什么是 Swagger?你用 Spring Boot 实现了它吗?

    Swagger 广泛用于可视化 API,使用 Swagger UI 为前端开发人员提供在线沙箱。Swagger 是用于生成 RESTful Web 服务的可视化表示的工具,规范和完整框架实现。它使文档能够以与服务器相同的速度更新。当通过 Swagger 正确定义时,消费者可以使用最少量的实现逻辑来理解远程服务并与其进行交互。因此,Swagger消除了调用服务时的猜测。

    前后端分离,如何维护接口文档 ?

    前后端分离开发日益流行,大部分情况下,我们都是通过 Spring Boot 做前后端分离开发,前后端分离一定会有接口文档,不然会前后端会深深陷入到扯皮中。一个比较笨的方法就是使用 word 或者 md 来维护接口文档,但是效率太低,接口一变,所有人手上的文档都得变。在 Spring Boot 中,这个问题常见的解决方案是 Swagger ,使用 Swagger 我们可以快速生成一个接口文档网站,接口一旦发生变化,文档就会自动更新,所有开发工程师访问这一个在线网站就可以获取到最新的接口文档,非常方便。

    其他

    如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?Spring Boot项目如何热部署?

    这可以使用 DEV 工具来实现。通过这种依赖关系,您可以节省任何更改,嵌入式tomcat 将重新启动。Spring Boot 有一个开发工具(DevTools)模块,它有助于提高开发人员的生产力。Java 开发人员面临的一个主要挑战是将文件更改自动部署到服务器并自动重启服务器。开发人员可以重新加载 Spring Boot 上的更改,而无需重新启动服务器。这将消除每次手动部署更改的需要。Spring Boot 在发布它的第一个版本时没有这个功能。这是开发人员最需要的功能。DevTools 模块完全满足开发人员的需求。该模块将在生产环境中被禁用。它还提供 H2 数据库控制台以更好地测试应用程序。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>
    

    您使用了哪些 starter maven 依赖项?

    使用了下面的一些依赖项

    spring-boot-starter-activemq

    spring-boot-starter-security

    这有助于增加更少的依赖关系,并减少版本的冲突。

    Spring Boot 中的 starter 到底是什么 ?

    首先,这个 Starter 并非什么新的技术点,基本上还是基于 Spring 已有功能来实现的。首先它提供了一个自动化配置类,一般命名为 XXXAutoConfiguration ,在这个配置类中通过条件注解来决定一个配置是否生效(条件注解就是 Spring 中原本就有的),然后它还会提供一系列的默认配置,也允许开发者根据实际情况自定义相关配置,然后通过类型安全的属性注入将这些配置属性注入进来,新注入的属性会代替掉默认属性。正因为如此,很多第三方框架,我们只需要引入依赖就可以直接使用了。当然,开发者也可以自定义 Starter

    spring-boot-starter-parent 有什么用 ?

    我们都知道,新创建一个 Spring Boot 项目,默认都是有 parent 的,这个 parent 就是 spring-boot-starter-parent ,spring-boot-starter-parent 主要有如下作用:

    1. 定义了 Java 编译版本为 1.8 。
    2. 使用 UTF-8 格式编码。
    3. 继承自 spring-boot-dependencies,这个里边定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号。
    4. 执行打包操作的配置。
    5. 自动化的资源过滤。
    6. 自动化的插件配置。
    7. 针对 application.properties 和 application.yml 的资源过滤,包括通过 profile 定义的不同环境的配置文件,例如 application-dev.properties 和 application-dev.yml。

    Spring Boot 打成的 jar 和普通的 jar 有什么区别 ?

    Spring Boot 项目最终打包成的 jar 是可执行 jar ,这种 jar 可以直接通过 java -jar xxx.jar 命令来运行,这种 jar 不可以作为普通的 jar 被其他项目依赖,即使依赖了也无法使用其中的类。

    Spring Boot 的 jar 无法被其他项目依赖,主要还是他和普通 jar 的结构不同。普通的 jar 包,解压后直接就是包名,包里就是我们的代码,而 Spring Boot 打包成的可执行 jar 解压后,在 \BOOT-INF\classes 目录下才是我们的代码,因此无法被直接引用。如果非要引用,可以在 pom.xml 文件中增加配置,将 Spring Boot 项目打包成两个 jar ,一个可执行,一个可引用。

    运行 Spring Boot 有哪几种方式?

    1)打包用命令或者放到容器中运行

    2)用 Maven/ Gradle 插件运行

    3)直接执行 main 方法运行

    Spring Boot 需要独立的容器运行吗?

    可以不需要,内置了 Tomcat/ Jetty 等容器。

    开启 Spring Boot 特性有哪几种方式?

    1)继承spring-boot-starter-parent项目

    2)导入spring-boot-dependencies项目依赖

    如何使用 Spring Boot 实现异常处理?

    Spring 提供了一种使用 ControllerAdvice 处理异常的非常有用的方法。 我们通过实现一个 ControlerAdvice 类,来处理控制器类抛出的所有异常。

    如何使用 Spring Boot 实现分页和排序?

    使用 Spring Boot 实现分页非常简单。使用 Spring Data-JPA 可以实现将可分页的传递给存储库方法。

    微服务中如何实现 session 共享 ?

    在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,各自的 session 被从物理空间上隔离开了,但是经常,我们需要在不同微服务之间共享 session ,常见的方案就是 Spring Session + Redis 来实现 session 共享。将所有微服务的 session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session 。这样就实现了 session 共享,Spring Session 基于 Spring 中的代理过滤器实现,使得 session 的同步操作对开发人员而言是透明的,非常简便。

    Spring Boot 中如何实现定时任务 ?

    定时任务也是一个常见的需求,Spring Boot 中对于定时任务的支持主要还是来自 Spring 框架。

    在 Spring Boot 中使用定时任务主要有两种不同的方式,一个就是使用 Spring 中的 @Scheduled 注解,另一个则是使用第三方框架 Quartz。

    使用 Spring 中的 @Scheduled 的方式主要通过 @Scheduled 注解来实现。

    使用 Quartz ,则按照 Quartz 的方式,定义 Job 和 Trigger 即可。

    展开全文
  • 最新版本的Struts2+Spring4+Hibernate4框架整合

    千次下载 热门讨论 2014-10-15 14:39:34
    项目原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6 二、 项目目的: 整合使用最新版本的三大框架(即Struts2、Spring4和Hibernate4),搭建项目架构原型。 项目架构原型:Struts2.3.16 + Spring4.1.1 + ...
  • mybatis-spring-1.2.2.jar

    千次下载 热门讨论 2014-04-15 15:46:31
    MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。 使用这个类库中的类, Spring 将会加载必要的 MyBatis 工厂类和 session 类。 这个类库也提供一个简单的方式来注入 MyBatis 数据映射器和 ...
  • spring4.x中的jar包下载,spring4.0.6下载,spring最新稳定版jar包下载 http://maven.springframework.org/release/org/springframework/spring/ 这个链接中有各种稳定版的jar包下载 目前官网上大部分都要maven下载
  • mybatis-spring-1.3.1.jar官方下载

    热门讨论 2017-03-17 09:48:40
    mybatis-spring-1.3.1.jar包,mybatis和spring整合用,最新版
  • spring security 4 需要 jar 包

    千次下载 热门讨论 2014-05-19 16:30:20
    spring security4 下载地址 http://repo.spring.io/snapshot/org/springframework/security/spring-security/4.0.0.CI-SNAPSHOT/ 所需要 jar 包 apacheds-core-1.5.5.jar aspectjrt-1.6.10.BUILD-20100810.234950-5...
  • 随着struts的安全问题的暴露,原由Struts2+spring+hibernate构成的SSH2已经被越来越多的开发者所弃用,反而,由Spring+SpringMVC+Hibernate构成的SSH框架越来越受欢迎!这里提供了一个案例代码,希望对大家搭建环境...
  • 通俗移动的Spring MVC入门书籍。请尊重版权,禁止用于商业目的。
  • spring 3.2.4.RELEASE jar包

    千次下载 热门讨论 2013-10-16 16:16:30
    spring 3.2.4 Realease 的所有jar包: spring-context-3.2.4.RELEASE.jar spring-core-3.2.4.RELEASE.jar spring-beans-3.2.4.RELEASE.jar spring-test-3.2.4.RELEASE.jar spring-web-3.2.4.RELEASE.jar spring-aop-...
  • spring完整demo实例

    千次下载 热门讨论 2014-11-01 20:16:21
    这是我自己总结的spring的一些特征,希望对你有所帮助,只需要改下路径就能用
  • SpringSecurity源码

    千次下载 热门讨论 2014-05-29 08:53:28
    SpringSecurity教程配套源码 专栏地址:http://blog.csdn.net/column/details/springsecurity.html
  • Spring框架从入门到精通

    万次阅读 多人点赞 2021-06-08 12:11:39
    初识Spring框架 时代变迁 原始时代我们用一个jsp搞定一切,但如此开发大型项目时我们遇到了问题,前端美化的代码和后端的代码交织,代码中又有html、js、css样式,又有业务逻辑和数据库访问代码,杂乱不清晰,美工和...

    初识Spring框架

    时代变迁

    原始时代我们用一个jsp搞定一切,但如此开发大型项目时我们遇到了问题,前端美化的代码和后端的代码交织,代码中又有html、js、css样式,又有业务逻辑和数据库访问代码,杂乱不清晰,美工和开发打架。

    于是mvc分层架构封建时代出现,把我们写代码的地方硬性分成3个地方,Model层封装数据,View视图层页面展现,Controller控制层访问转发。代码之间的耦合度降低。概念有了,需要实际干活的。于是随着mvc分层概念的深入人心,业界涌现出很多实现框架,最著名的莫过于struts1和struts2。随着前端框架的成熟,后端框架也应运而生如:dbutils、jdbcTemplate、hibernate、ibatis、mybatis。

    一个前端WEB层框架有了,一个后端数据库层访问框架有了,那中间呢?谁来胜任?spring破石而出。

    Spring的野心

    了解了历史,有个问题值得我们去深思?spring到底想干什么?

    它想把全球最好的技术组合到一起,为企业提供高质量的企业级的应用程序框架,减轻开发者开发的难度,减少重复的代码。

    目标很宏大,那如何下手呢?如果是你,你会怎么实现?第一步要干什么呢?

    我们拿经典的框架来举例子。

    struts2作为WEB框架深受企业爱戴,它会自己管理action,来创建其实例,这样在程序中就可以访问action的资源。hibernate作为持久层优秀的框架,它也自己管理持久对象。可以看到,各个诸侯都自己管理对象,而要想让它们对象复用,那真是繁琐。前面就有失败者WebService,为了管理不同的开发语言的对象而层层包装转换,辛苦制定的规则,还借着J2EE规范之名,也推广不开。

    如何破局呢?想发号施令,想让人听从,最好的解决办法就是扼住他们的咽喉。在java的世界里最重要的无疑就是对象的生命周期管理。于是spring以此为切入点,实现自己的统治。官宣所有对象由我来管理,struts2你不再管理对象,由我来管理,你要用从我这拿。hibernate你也不再管理对象,由我来管理,你要用从我这拿。你说管就能管的吗?这两个征战数年战功赫赫的大将军会听一个初出茅庐乳臭未干野小子的话?他们当然不会听,spring的话可以不听,但他们都要听开发者的。开发一个完整的系统有四个核心,WEB层支持、业务逻辑层、持久层支持、事务支持。而这就是它们的软肋,这就是它们的命门所在,它们只能完成一部分工作,不是一个整体解决方案。而spring并没有抹杀它们,而是依然给它们高官厚禄,承认它们的市场地位,还赠与一个事务管理。一边打压一边拉拢,它们两位看看大势已去,只能俯首称臣。于是兵不血刃,一场变革悄然兴起,一个经典的三层框架诞生SSH (Strut2+Spring+Hibernate)。

    故事很传奇,听的人很开心。可spring真就这么简单吗?如果这样想,你就大错特错了。例如:spring怎么来实现对象的管辖?怎么让不同技术之间能简单的互相配合?这才是spring的决胜之处。

    为实现这些spring可是绞尽脑汁、煞费苦心呢。它创新的形成了一套新的理论体系,可谓前无古人后无来者。其中最核心的是:IoC控制反转、DI依赖注入、Bean工厂、SpringAOP面向切面编程、事务控制。

    并且spring并没有停止不前,这只是统治地球的第一步,随着spring占领市场后,开始对有功之臣进行清洗,struts2不再优秀,致命bug层出不穷,刚好落井下石,spring推出了springmvc,最终终结了struts2。hibernate想用jdbcTemplate和jdo替代,却被mybatis超越,目前还未统一。世界又达到新的平衡,经典的新三大框架诞生,SSM(SpringMVC+Spring+MyBatis)。Spring并没有放弃,而是另辟蹊径,推出新的产品SpringBoot+SpringCloud 微服务,目前新的趋势已经尘埃落定,一统江湖!

    官网

    http://spring.io
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jJWHUuTn-1623125484716)(RackMultipart20210608-4-9jbi5w_html_2993097c28b7d24a.png)]

    框架组成

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bng7UnWQ-1623125484730)(RackMultipart20210608-4-9jbi5w_html_c6b3da8deed43f6f.jpg)]

    Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。Spring框架的不光是技术牛,而是它的核心思想更牛,它不重复发明轮子,而是"拿来主义",把业界做的最好的技术黏合起来形成一个强大的企业级的应用框架。

    Spring 框架是一个分层架构,由7个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jsPyvCdC-1623125484732)(RackMultipart20210608-4-9jbi5w_html_f6b76c48c15a8c6e.jpg)]

    组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

    |

    模块说明
    核心容器Spring Core核心容器提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC)模式,将应用程序的配置和依赖性规范与实际的应用程序代码分开。
    Spring上下文Spring ContextSpring上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
    Spring AOP通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。可以很容易地使 Spring框架管理的任何对象支持AOP。Spring AOP模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
    Spring DAOJDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
    Spring ORMSpring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括JDO、Hibernate和iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
    Spring WebWeb上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以Spring 框架支持与 Jakarta Struts的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
    Spring MVC框架MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

    Spring 框架的功能可以用在任何J2EE服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定J2EE服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同J2EE环境(Web或EJB)、独立应用程序、测试环境之间重用。

    Spring以一种非侵入式的方式来管理你的代码,Spring提倡"最少侵入",这也就意味着你可以适当的时候安装或卸载Spring ,但这点越来越模糊。

    核心概念

    模块说明
    BeanFactorySpring内部使用,创建bean的工厂
    ApplicationContext外部应用程序调用,也成为spring容器
    IoC控制反转Inversion of Control开发者在无需自己new对象,无需关心对象的创建过程User user = new User(); 手动创建对象User user = context.getBean(user); 容器创建对象
    DI依赖注入Dependency Injection松耦合方式实现对象直接的依赖
    AOP面向切面编程补充java面向对象的不足

    三大核心组件的关系

    Bean、Context、Core三大核心组件的关系:

    Bean 包装的是 Object,而 Object 必然有数据,如何给这些数据提供生存环境就是 Context要解决的问题,对 Context 来说它就是要发现每个 Bean 之间的关系,为它们建立这种关系并且要维护好这种关系。所以 Context 就是一个Bean关系的集合,这个关系集合又叫 Ioc 容器,一旦建立起这个 Ioc 容器后 Spring 就可以为你工作了。那 Core 组件又有什么用武之地呢?其实Core 就是发现、建立和维护每个 Bean 之间的关系所需要的一些类的工具,从这个角度看来,Core 这个组件叫 Util 更能让你理解。

    把Bean 比作一场演出中的演员的话,那 Context 就是这场演出的舞台背景,而 Core应该就是演出的道具了。只有他们在一起才能具备能演出一场好戏的最基本的条件。当然有最基本的条件还不能使这场演出脱颖而出,还要他表演的节目足够的精彩,这些节目就是 Spring 能提供的特色功能了。

    主要jar组成

    模块说明
    org.springframework.core核心工具包,其他包依赖此包
    org.springframework.beans核心,包括:配置文件,创建和管理bean等
    org.springframework.aop面向切面编程,提供AOP的实现
    org.springframework.context提供IoC功能上的扩展服务,此外还提供许多企业级服务的支持,邮件、任务调度、JNDI定位、EJB集成、远程访问、缓存以及多种视图层框架的支持
    org.springframework.web.mvc包含SpringMVC应用开发时所需的核心类
    org.springframework.transaction为JDBC、Hibernate、JDO、JPA提供一致的声明式和编程式事务管理
    org.springframework.web包含Web应用开发时所需支持类
    org.springframework.aspects提供对AspectJ框架的支持
    org.springframework.test对junit等测试框架的简单封装
    org.springframework.asm3.0后提供自己独立的,反编译
    org.springframework.context.supportContext的扩展支持,用于mvc方面
    org.springframework.expressionSpring表达式语言
    org.springframework.instument对服务器的代理接口
    org.springframework.jdbc对jdbc的简单封装
    org.springframework.jms为简化jms api的使用而做的简单封装
    org.springframework.orm整合第三方orm,如hibernate/mybatis
    org.springframework.web.servlet增强servlet

    Spring框架两大核心:IoC和DI

    概念

    • IoC(Inversion of Control)简单来说就是将对象Object的创建的权力及对象的生命周期的管理过程交由Spring框架来处理,从此在开发过程中不在需要关注对象的创建和生命周期的管理,而是在需要的时候由Spring框架提供,这个由Spring框架管理对象创建和生命周期的机制称之为控制反转。
    • 在创建对象的过程中Spring可以依据对象的关系,自动把其它对象注入(无需创建对象,直接拿着使用)进来,这个过程称之为DI(Dependency Injection)依赖注入。

    总结下Spring核心就干了两件事:

    1. 创建对象
    2. 设置对象的关联关系

    IoC

    IOC(Inversion of Control),控制反转。

    就是指将对象的创建,对象的存储(map),对象的管理(依赖查找,依赖注入)交给了spring容器。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FXpxKfc1-1623125484736)(RackMultipart20210608-4-9jbi5w_html_cffa20c878203547.png)]

    DI

    DI(Dependency Injection)依赖注入 。

    相对于IoC而言,依赖注入(DI)更加准确地描述了IoC的设计理念。所谓依赖注入,即组件之间的依赖关系由容器在应用系统运行期来决定,也就是由容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件之中。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hhlhCGxn-1623125484738)(RackMultipart20210608-4-9jbi5w_html_c5ec83eb26f6a77c.png)]

    IoC的XML方式

    创建springboot工程

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sc8qiKom-1623125484741)(RackMultipart20210608-4-9jbi5w_html_a81a3b8b31cbb0c1.png)]

    创建Hello.java

    package spring;
    
    public class Hello {
    	public void hi() {
    		System.out.println("Hello Spring.");
    	}
    }
    
    

    创建applicationContext.xml

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-si8cTokC-1623125484745)(RackMultipart20210608-4-9jbi5w_html_96b7dbd526bb4359.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vCTqslHh-1623125484746)(RackMultipart20210608-4-9jbi5w_html_b1bbdfbf87e410c9.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rprNUB6f-1623125484748)(RackMultipart20210608-4-9jbi5w_html_b9a934247299f10e.png)]

    创建TestIoC.java

    package spring;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class TestIoC {
    	@Test
    	public void bean() {
    		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    		Hello h1 = new Hello();
    		System.out.println(h1);
    		h1.hi();
    		//根据id获取bean
            //Spring就是一个大工厂(容器)专门生成bean,bean就是对象
    		Hello hello = (Hello)ac.getBean("Hello");
    		System.out.println(hello);
    		hello.hi();
    	}
    }
    
    

    小结

    这就是spring框架的IoC,控制反转。之前我们自己new出新类。new User();变成由一个初始化的xml配置文件来创建,也就是由spring容器来创建。遍历xml配置文件,读取到&lt;bean&gt;,获取到class属性的类的全路径,利用反射创建这个类。

    在java范畴中万物皆Object,在Spring中万物皆Bean。Bean是Spring的核心、基础、根源。

    IoC的注解方式

    创建springboot工程

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ri6SJKC1-1623125484750)(RackMultipart20210608-4-9jbi5w_html_a81a3b8b31cbb0c1.png)]

    pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<groupId>cn.tedu</groupId>
    	<artifactId>spring</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    
    	<!-- 集中定义依赖版本号 -->
    	<properties>
    		<junit.version>4.10</junit.version>
    		<spring.version>4.1.3.RELEASE</spring.version>
    	</properties>
    
    	<dependencies>
    		<!-- 单元测试 -->
    		<dependency>
    			<groupId>junit</groupId>
    			<artifactId>junit</artifactId>
    			<version>${junit.version}</version>
    			<scope>test</scope>
    		</dependency>
    
    		<!-- Spring -->
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-webmvc</artifactId>
    			<version>${spring.version}</version>
    		</dependency>
    
    	</dependencies>
    </project>
    
    

    Hello.java

    package spring;
    
    import org.springframework.stereotype.Component;
    
    @Component//让spring容器认识
    public class Hello {
    	public void hi() {
    		System.out.println("Hello Spring.");
    	}
    }
    
    

    applicationContext.xml

    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
    	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    	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-4.0.xsd
    	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
    	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
    
    
    	
    <!-- 包扫描, 用注解的方式,配置bean 
    		会扫描 指定包下,@Component注解的类
    		并注入spring容器中,key是类名小写,value是类的对象
    	-->
    	<context:component-scan base-package="cn.tedu" />
    </beans>
    
    

    TestIoC.java

    package spring;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class TestIoC {
    	@Test
    	public void bean() {
    		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    		//根据id获取bean,beanname就是类名,首字母变小写
            Hello hello = (Hello) ac.getBean("hello");
    		System.out.println(hello);
    		hello.hi();
    	}
    }
    
    

    DI依赖注入

    创建Maven工程

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ti5fETLX-1623125484753)(RackMultipart20210608-4-9jbi5w_html_bce5608d4bca1c8c.png)]

    pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<groupId>cn.tedu</groupId>
    	<artifactId>spring</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    
    	<!-- 集中定义依赖版本号 -->
    	<properties>
    		<junit.version>4.10</junit.version>
    		<spring.version>4.1.3.RELEASE</spring.version>
    	</properties>
    
    	<dependencies>
    		<!-- 单元测试 -->
    		<dependency>
    			<groupId>junit</groupId>
    			<artifactId>junit</artifactId>
    			<version>${junit.version}</version>
    			<scope>test</scope>
    		</dependency>
    
    		<!-- Spring -->
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-webmvc</artifactId>
    			<version>${spring.version}</version>
    		</dependency>
    
    	</dependencies>
    </project>
    
    

    Dept.java

    package spring.pojo;
    import org.springframework.stereotype.Component;
    @Component
    public class Dept {
    	 String name = "java开发部";
    
        @Override
        public String toString() {
            return "Dept{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }
    
    

    User.java

    package spring.pojo;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    @Component
    public class User {
    	String name = "jack";
        @Autowired  //相当于框架完成了:new User().setDept(new Dept());
        Dept dept;
    
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", dept=" + dept +
                    '}';
        }
    }
    
    

    applicationContext.xml

    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
    	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    	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-4.0.xsd
    	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
    	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
    
    
    	<!-- 扫描包 -->
    	<context:component-scan base-package="cn.tedu.pojo" />
    </beans>
    
    

    TestDI.java

    package test;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import spring.pojo.Dept;
    import spring.pojo.User;
    
    public class TestDI {
    	public static void main(String[] args) {
    		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    		
    		Dept d = (Dept)ac.getBean("dept");
    		User u = (User)ac.getBean("user");
    		
    		System.out.println(d);
    		System.out.println(u);
    		
    		System.out.println(u.dept.name);
    	}
    }
    
    

    小结

    面试:IoC和DI

    在平时的java应用开发中,我们要实现某一个功能或者说是完成某个业务逻辑时可能需要多个对象来协作完成,在没有使用Spring的时候,每个对象在需要使用他的合作对象时,自己均要使用像new object() 这样的语法来将合作对象创建出来,这个合作对象是由自己主动创建出来的,创建合作对象的主动权在自己手上,自己需要哪个合作对象,就主动去创建,创建合作对象的主动权和创建时机是由自己把控的,而这样就会使得对象间的耦合度高了,A对象需要使用合作对象B来共同完成一件事,A要使用B,那么A就对B产生了依赖,也就是A和B之间存在一种耦合关系,并且是紧密耦合在一起,而使用了Spring之后就不一样了,创建合作对象B的工作是由Spring来做的,Spring创建好B对象,然后存储到一个容器里面,当A对象需要使用B对象时,Spring就从存放对象的那个容器里面取出A要使用的那个B对象,然后交给A对象使用,至于Spring是如何创建那个对象,以及什么时候创建好对象的,A对象不需要关心这些细节问题(你是什么时候生的,怎么生出来的我可不关心,能帮我干活就行),A得到Spring给我们的对象之后,两个人一起协作完成要完成的工作即可。

    所以控制反转IoC(Inversion of Control)是说创建对象的控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,比如转移交给了IoC容器,它就是一个专门用来创建对象的工厂,你要什么对象,它就给你什么对象,有了 IoC容器,依赖关系就变了,原先的依赖关系就没了,它们都依赖IoC容器了,通过IoC容器来建立它们之间的关系。

    DI(依赖注入)其实就是IOC的另外一种说法,DI是由Martin Fowler 在2004年初的一篇论文中首次提出的。他总结:控制的什么被反转了?就是:获得依赖对象的方式反转了。

    IoC是设计思想,IoC有三个核心:BeanFactory、反射、DI。BeanFactory利用反射实现对象的创建,DI实现对象关系管理。

    自动装配

    利用注解方式,我们只需要写@Autowired注解,底层就会去容器中找对应的对象,如果有获取到,反射调用其对应的set方法,设置。而这个调用过程都是自动,我们没有手工去写set方法。所以这个过程也称为自动装配。

    AOP面向切面编程

    概念

    Spring核心特征中除了IoC控制反转、DI依赖注入,还有一个核心就是强大的面向切面编程AOP(Aspect Oriented Programming)的实现。
    AOP 是实现程序功能统一维护的一种技术。它把 众多模块 涉及到的同一类问题进行了统一处理。利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合性降低,提高程序的可重用性,同时大大提高了开发效率。
    

    在这里插入图片描述

    AspectJ

     AspectJ 作为 Java 中流行的 AOP(aspect-oriented programming) 编程扩展框架,有一些自己的语法和特点,Spring框架底层也是采用的 AspectJ来实现的面向切面编程。
     他成熟稳定,输入输出都是 .class 文件,直接处理字节码文件,这个过程并不简单,特别是 针对于字节码的格式和各种指令规则,如果处理出错,就会导致程序编译或者运行过程中出现问题。
     他使用起来非常简单,并且它的功能非常强大,我们完全不需要理解任何 Java 字节码相关的知识,就可以在很多情况下对字节码进行操控。
    

    AOP的三要素

    切面(Aspect) 类是对物体特征的抽象,切面就是对同一类问题(横切关注点)的抽象
    通知(Advice) 来指定具体做什么事情。如方法执行前做什么,方法执行后做什么,抛出异常做什么,从而实现对象行为(方法)的增强
    切点(PointCut) 配置切点表达式(expression)来指定在哪些类的哪些方法上织入(ware)横切一些逻辑
    连接点(JoinPoint) JPoint 是一个程序的关键执行点,也是我们关注的重点。它就是指被切点拦截到的点然后执行一些通知

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ndLcvTsq-1623125484755)(RackMultipart20210608-4-9jbi5w_html_c5e7751ad417952f.png)]

    通知

    Spring框架实现了AOP面向切面,其引入了第三方AspectJ框架来具体实现。
    AspectJ提供了五种切入方式,术语称为通知advice。
    具体五种为:

    1. 前置通知before
    2. 后置通知after
    3. 环绕通知around
    4. 返回后通知afterReturning
    5. 异常通知afterThrowing。
      异常通知特殊,这里暂不讨论。
      可以看到,分别在业务方法(Business Method)的执行前后进行拦截,执行指定的代码。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zQfJDgzH-1623125484756)(RackMultipart20210608-4-9jbi5w_html_d0e5a5c2ce593c85.png)]

    多切面执行顺序

    下面是 两个切面 各通知的执行顺序:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T3Fp3bGa-1623125484757)(RackMultipart20210608-4-9jbi5w_html_c0c35cb4628046db.png)]

    使用步骤

    1, 加入jar包

    <dependencies>
         <!--添加aop依赖包-->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-aop</artifactId>
         </dependency>
     </dependencies>
    

    2, 创建切面,提供通知和切点
    3, 测试

    创建切面

    package cn.tedu;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.springframework.stereotype.Component;
    
    import java.util.Arrays;
    
    @Component
    @Aspect//切面:由切点和通知组成
    public class AspectD {
        //切点表达式: *表示1个 ..表示多个 *依次代表方法返回值,类名,方法名,(..)是参数列表
        @Pointcut("execution(* cn.tedu.service.*.*(..))")
        public void pointcut(){}
    
        @Before("pointcut()")//前置通知,在每一个方法开始之前被调用
        public void beforeMethod(JoinPoint joinPoint){
            System.out.println("我是前置通知");
        }
        @After("pointcut()")//后置通知,在每一个方法结束后被调用
        public void afterMethod(JoinPoint joinPoint){
            System.out.println("我是后置通知");
        }
        @Around("pointcut()")//环绕通知,方法执行前后都被调用,必须有返回值
        public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
            long time = System.currentTimeMillis();
            Object o = joinPoint.proceed();//放行,执行目标方法
            time= System.currentTimeMillis()-time;
    
            String methodName = joinPoint.getSignature().getName();//方法名
            System.out.print("我是环绕通知");
            System.out.println(methodName+"===耗时:"+time+"===");
            return o;
        }
    
    }
    
    

    测试

    创建启动类,打开浏览器访问以下程序即可观察到控制台的输出效果

    package cn.tedu;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("c")
    public class ControllerImpl {
        @RequestMapping("a")
        public void add(){
            for (int i = 0; i < 100; i++) {
                System.out.print("~");
            }
        }
    }
    
    
    展开全文
  • spring-framework-4.2.4.RELEASE-dist

    千次下载 热门讨论 2016-01-12 09:59:34
    spring-framework-4.2.4.RELEASE-dist;官网不好下载了。这里分享下资源给大家,完整的spring开发jar包源码包,说明文档,全都有,最新版本不断更新中。
  • Spring Data实战

    千次下载 热门讨论 2014-11-13 10:57:51
    Spring Data实战》介绍了Spring Data、Repository、Querydsl的基础理念,然后阐述了借助Spring Data如何简化NoSQL和大数据的访问,并且涵盖了使用Spring Roo和Spring Data REST导出功能如何实现应用的快速开发,除...
  • Spring入门第一讲——Spring框架的快速入门

    万次阅读 多人点赞 2017-04-08 00:27:34
    Spring的概述什么是Spring据度娘所载: Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。 ...

    Spring的概述

    什么是Spring?

    我们可以从度娘上看到这样有关Spring的介绍:
    在这里插入图片描述
    说得更加详细一点,Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。
    为什么说Spring是一个一站式的轻量级开源框架呢?EE开发可分成三层架构,针对JavaEE的三层结构,每一层Spring都提供了不同的解决技术。
    在这里插入图片描述
    从对Spring的简要介绍中,我们知道了Spring的核心有两部分:

    • IoC:即控制反转。举例来说,在之前的操作中,比方说有一个类,我们想要调用类里面的方法(不是静态方法),就要创建该类的对象,使用对象调用方法来实现。但对于Spring来说,Spring创建对象的过程,不是在代码里面实现的,而是交给Spring来进行配置实现的;
    • AOP:即面向切面编程。之前,讲Struts2框架的拦截器时,我们就已稍微讲了一下,在Spring后续的学习过程中,我们会着重来讲它,但是本文并不会过多阐述它。

    为什么学习Spring?

    在度娘上查看有关Spring的介绍时,我们可以找到如下一系列Spring的优点,这就是我们要学习Spring框架的原因。
    在这里插入图片描述

    Spring的快速入门

    Spring的版本

    需要说明的是,本系列入门Spring的教程使用的版本是spring-framework-4.2.4.RELEASE。

    IoC概述

    什么是IoC?

    IoC即Inversion of Control,反应过来就是控制反转。啥是控制反转啊?控制反转指的就是将对象的创建权反转给(交给)了Spring,其作用是实现了程序的解耦合。也可这样解释:获取对象的方式变了,对象创建的控制权不是"使用者",而是"框架"或者"容器"。用更通俗的话来说,IoC就是指对象的创建,并不是在代码中用new操作new出来的,而是通过Spring进行配置创建的。

    Spring的IoC的底层实现原理

    这里先给出结论:Spring的IoC的底层实现原理是工厂设计模式+反射+XML配置文件。 就拿持久层(也即dao层,data access object,数据访问对象)的开发来说,官方推荐做法是先创建一个接口,然后再创建接口对应的实现类。所以,这里,我会以dao层的开发为例来证明Spring的IoC的底层实现原理就是工厂设计模式+反射+XML配置文件。
    首先,创建一个Userdao接口。

    public interface UserDao {
    	public void add();
    }
    

    然后,再创建Userdao接口的一个实现类(UserDaoImpl.java)。

    public class UserDaoImpl implements UserDao {
        public void add() {
    	    balabala......
        }
    }
    

    接着,我们在service层中调用dao层,核心代码如下:

    // 接口 实例变量 = new 实现类
    UserDao dao = new UserDaoImpl();
    dao.add();
    

    这时我们便可发现一个缺点:service层和dao层耦合度太高了,即接口和实现类有耦合(它俩之间的联系过于紧密),一旦切换底层实现类,那么就需要修改源代码,这真的不是一个好的程序设计,好的程序设计应当满足OCP原则(也即开闭原则),即在尽量不修改程序源代码的基础上对程序进行扩展。说到这里,我就不得不稍微讲一下面向对象设计的七大原则了,它不必强记,重在理解。
    在这里插入图片描述
    出现的这个问题该如何解决呢?解决方法是使用工厂设计模式进行解耦合操作。所以,我们需要创建一个工厂类,在工厂类中提供一个方法,返回实现类的对象。

    public class BeanFactory {
        // 提供返回实现类对象的方法
        public static UserDao getUserDao() {
            return new UserDaoImpl();
        }
    }
    

    这样,在service层中调用dao层的核心代码就变为了下面的样子。

    UserDao dao = BeanFactory.getUserDao();
    dao.add();
    

    如若这样做,会发现又产生了一个缺点:现在接口和实现类之间是没有耦合了,但是service层和工厂类耦合了。如果真正想实现程序之间的解耦合,那么就需要使用到工厂设计模式+反射+XML配置文件了。所以,我们这里提供一个XML配置文件,并且该配置文件中有如下配置信息。

    <bean id="userDao" class="com.meimeixia.dao.impl.UserDaoImpl" />
    

    然后再来创建一个工厂类,在工厂类中提供一个返回实现类对象的方法,但并不是直接new实现类,而是使用SAX解析配置文件,根据标签bean中的id属性值得到对应的class属性值,使用反射创建实现类对象。

    public class BeanFactory {
        public static Object getBean(String id) {
            // 1.使用SAX解析得到配置文件内容
            // 直接根据id值userDao得到class属性值
            String classvalue = "class属性值";
            // 2.使用反射得到对象
            Class clazz = Class.forName(classvalue);
            UserDaoImpl userDaoImpl = (UserDaoImpl)lazz.newInstance();
            return userDaoImpl;
        }
    }
    

    以上就是Spring的IoC的底层实现原理。

    Spring的IoC入门

    下载Spring的开发包

    Spring的官网是https://spring.io/,Spring的开发包的下载地址是https://repo.spring.io/libs-release-local/org/springframework/spring/,上面说过,我下载的是spring-framework-4.2.4.RELEASE这个版本的Spring。解压缩之后,可发现Spring开发包的目录结构如下。
    在这里插入图片描述

    创建web项目,引入Spring的开发包

    首先创建一个动态web项目,例如spring_demo01,然后导入Spring框架相关依赖jar包,要导入哪些jar包呢?这是一个问题。
    在这里插入图片描述
    由于我们只是初次入门Spring,所以也只是使用到了Spring的基本功能,从上图红框框中的部分可知,我们需要使用到下面的这4个jar包。
    在这里插入图片描述
    除此之外,还要导入Spring支持的日志jar包,也就是下面两个jar包。
    在这里插入图片描述
    关于以上两个jar包,我稍微做一下解释,com.springsource.org.apache.commons.logging-1.1.1.jar它里面都是一些接口,有接口,那当然要有实现类了,恰好,com.springsource.org.apache.log4j-1.2.15.jar里面就是那些接口的实现类。使用Log4j,我们可以查看到当前运行程序中对象创建的过程,也可以看到更详细的信息,Log4j适合使用在程序调试中。
    导入完日志相关的jar包之后,我们还要导入日志记录文件,即在src目录下引入Log4j的配置文件(log4j.properties),该文件内容如下:

    ### direct log messages to stdout ###
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.err
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    
    ### direct messages to file mylog.log ###
    log4j.appender.file=org.apache.log4j.FileAppender
    log4j.appender.file.File=c\:mylog.log
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    
    ### set log levels - for more verbose logging change 'info' to 'debug' ###
    # error warn info debug trace
    log4j.rootLogger= info, stdout
    

    对以上日志记录文件,我会粗略讲解一下。
    在这里插入图片描述
    从上图可知,log4j.rootLogger就是用于设置日志的输出级别,那么日志的输出级别有几种呢?有如下5种。
    在这里插入图片描述

    创建接口和实现类

    首先,在src目录下创建一个com.meimeixia.spring.demo01包,并在该包下创建一个名为UserDao的接口。

    package com.meimeixia.spring.demo01;
    
    /**
     * 用户管理的dao层的接口
     * @author liayun
     *
     */
    public interface UserDao {
    
    	public void save();
    	
    }
    

    然后,在com.meimeixia.spring.demo01包下创建UserDao接口的一个实现类——UserDaoImpl.java。

    package com.meimeixia.spring.demo01;
    
    /**
     * 用户管理的dao层接口的实现类
     * @author liayun
     *
     */
    public class UserDaoImpl implements UserDao {
    
    	@Override
    	public void save() {
    		System.out.println("UserDaoImpl中的save方法执行了......");
    	}
    	
    }
    

    将实现类交给Spring管理

    首先,我们需要创建Spring的配置文件,Spring配置文件的名称和位置没有固定要求,一般建议把该文件放到src目录下面,名称可随便写,官方建议写成applicationContext.xml。然后我们还需要在配置文件中引入约束,Spring学习阶段的约束是schema约束。那么问题来了,这个约束又该怎么写呢?可参考docs\spring-framework-reference\html目录下的xsd-configuration.html文件,在其内容最后面找到如下内容。
    在这里插入图片描述
    将其复制黏贴到配置文件applicationContext.xml中,这样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 
            http://www.springframework.org/schema/beans/spring-beans.xsd">
            
    </beans>
    

    最后,咱还要将实现类交给Spring来管理,即在配置文件中配置对象的创建。

    <?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 id="userDao" class="com.meimeixia.spring.demo01.UserDaoImpl"></bean>
    	
    </beans>
    

    编写测试类

    我们要在Spring中写代码来实现获取applicationContext.xml文件中配置的对象,这段代码不要求大家重点掌握,只是用在测试中而已。这段代码主要用来解析Spring配置文件得到对象,但这个过程不需要我们写代码来实现了,Spring已经封装了一个对象来帮我们进行了这些操作,这个对象叫ApplicationContext,它就能实现这个功能。于是,我们需要在com.meimeixia.spring.demo01包下创建一个SpringDemo01的单元测试类。

    package com.meimeixia.spring.demo01;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.context.support.FileSystemXmlApplicationContext;
    
    /**
     * Spring的入门
     * @author liayun
     *
     */
    public class SpringDemo01 {
    	
    	/*
    	 * 传统方式的调用
    	 */
    	@Test
    	public void demo01() {
    		UserDao userDao = new UserDaoImpl();
    		userDao.save();
    	}
    	
    	/*
    	 * Spring的方式的调用
    	 */
    	@Test
    	public void demo02() {
    		//先要创建Spring的工厂
    		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");// classpath就是类路径,src目录下的文件最终要编译到类路径下
    		UserDao userDao = (UserDao) applicationContext.getBean("userDao");
    		userDao.save();
    	}
    
    }
    

    然后,运行以上demo02单元测试方法,Eclipse控制台就会打印如下内容。
    在这里插入图片描述

    Spring IoC和DI的区别

    IoC上面我已经讲过了,它指的就是将对象的创建权反转给(交给)了Spring。那DI又是什么鬼呢?DI,即Dependency Injection,翻译过来就是依赖注入,它指的就是Spring在管理某个类的时候会将该类依赖的属性注入(设置)进来,也就是说在创建对象的过程中,向类里面的属性中设置值。注意:依赖注入不能单独存在,须在控制反转基础之上完成,用更通俗点的话来说,就是注入类里面的属性值,不能直接注入,须创建类的对象再完成注入。
    你还记得在面向对象设计的时候,类和类之间有几种关系吗?有3种,它们分别是:

    • 依赖,由于下图中B类的方法用到了A类,所以此时就可以说B类依赖于A类;
      在这里插入图片描述
    • 继承(is a),这种关系我们应该是见的要吐了;
      在这里插入图片描述
    • 聚合(has a),它有松散和紧密之分。例如,球队得有一个守门员,即使这个球队没有了这个守门员,它也还是一个球队,所以它是松散的;人得有一个脑袋,此时它就是紧密的。

    说了这么多,咱就通过一个案例来看看DI在程序的体现。现在,我们想要给UserDaoImpl这个实现类里面的某一个属性(例如String类型的name)设置值,该咋怎呢?首先,将UserDaoImpl这个实现类修改成下面这个样子。

    package com.meimeixia.spring.demo01;
    
    /**
     * 用户管理的dao层接口的实现类
     * @author liayun
     *
     */
    public class UserDaoImpl implements UserDao {
    	
    	private String name;
    	
    	//提供set方法
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	@Override
    	public void save() {
    		System.out.println("UserDaoImpl中的save方法执行了......" + name);
    	}
    	
    }
    

    如果使用传统的方式来为UserDaoImpl实现类的name属性设置值,那么SpringDemo01单元测试类中的demo01方法就应该写成下面这个样子。

    package com.meimeixia.spring.demo01;
    
    import org.junit.Test;
    
    /**
     * Spring的入门
     * @author liayun
     *
     */
    public class SpringDemo01 {
    	
    	/*
    	 * 传统方式的调用
    	 */
    	@Test
    	public void demo01() {
    		/*
    		 * 我想给这个类里面的某一个属性设置值,挺麻烦的!
    		 * 
    		 * 1. 不能面向接口编程了
    		 * 2. 你还得手动调用set方法,也得去改变程序的源代码
    		 */
    		UserDaoImpl userDao = new UserDaoImpl();
    		userDao.setName("李二");
    		userDao.save();
    	}
    
    }
    

    这样写,就有两个缺点,一是不能面向接口编程了,二是咱还得手动调用对象的set方法,这必然就涉及到要改变程序的源代码了,这是我们不能接受的!
    如果使用了依赖注入,即在applicationContext.xml文件中为配置好的UserDaoImpl实现类的name属性注入一个值,那么情况就完全不同了,以上两个缺点也就不复存在了。

    <?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 id="userDao" class="com.meimeixia.spring.demo01.UserDaoImpl">
    		<!-- DI:依赖注入 -->
    		<property name="name" value="李二" />
    	</bean>
    	
    </beans>
    

    此时,SpringDemo01单元测试类中的demo02方法依然不变,如下。

    package com.meimeixia.spring.demo01;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.context.support.FileSystemXmlApplicationContext;
    
    /**
     * Spring的入门
     * @author liayun
     *
     */
    public class SpringDemo01 {
    	
    	/*
    	 * 传统方式的调用
    	 */
    	@Test
    	public void demo01() {		
    		/*
    		 * 我想给这个类里面的某一个属性设置值,挺麻烦的!
    		 * 
    		 * 1. 不能面向接口编程了
    		 * 2. 你还得手动调用set方法,也得去改变程序的源代码
    		 */
    		UserDaoImpl userDao = new UserDaoImpl();
    		userDao.setName("李二");
    		userDao.save();
    	}
    	
    	/*
    	 * Spring的方式的调用
    	 */
    	@Test
    	public void demo02() {
    		//先要创建Spring的工厂
    		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    		UserDao userDao = (UserDao) applicationContext.getBean("userDao");
    		userDao.save();
    	}
    
    }
    

    运行以上demo02单元测试方法,Eclipse控制台就会打印出如下内容。
    在这里插入图片描述

    Spring的工厂类

    Spring工厂类的结构图

    在这里插入图片描述
    从上图可以看出ApplicationContext(接口)继承自BeanFactory(接口)。

    BeanFactory:老版本的工厂类

    BeanFactory是老版本的工厂类,稍微了解一下就好,这个类在实际开发中我们并不需要用到。需要说明的一点是,它只有在调用getBean方法的时候,才会生成Spring所管理的类的实例。

    ApplicationContext:新版本的工厂类

    ApplicationContext是新版本的工厂类,它在加载配置文件的时候,就会将Spring所管理的类都实例化。ApplicationContext这个接口有两个实现类,如下图所示。
    在这里插入图片描述
    ClassPathXmlApplicationContext这个实现类前面用过了,下面咱就来用一下FileSystemXmlApplicationContext这个实现类。首先,拷贝一份applicationContext.xml文件到C盘下,其内容做一点点修改。
    在这里插入图片描述
    然后,在SpringDemo01单元测试类中编写如下一个demo03方法。

    package com.meimeixia.spring.demo01;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.context.support.FileSystemXmlApplicationContext;
    
    /**
     * Spring的入门
     * @author liayun
     *
     */
    public class SpringDemo01 {
    	
    	/*
    	 * 传统方式的调用
    	 */
    	@Test
    	public void demo01() {	
    		/*
    		 * 我想给这个类里面的某一个属性设置值,挺麻烦的!
    		 * 
    		 * 1. 不能面向接口编程了
    		 * 2. 你还得手动调用set方法,也得去改变程序的源代码
    		 */
    		UserDaoImpl userDao = new UserDaoImpl();
    		userDao.setName("李二");
    		userDao.save();
    	}
    	
    	/*
    	 * Spring的方式的调用
    	 */
    	@Test
    	public void demo02() {
    		//先要创建Spring的工厂
    		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    		UserDao userDao = (UserDao) applicationContext.getBean("userDao");
    		userDao.save();
    	}
    	
    	/*
    	 * 加载磁盘上的配置文件
    	 */
    	@Test
    	public void demo03() {
    		//先要创建Spring的工厂
    		ApplicationContext applicationContext = new FileSystemXmlApplicationContext("C:\\applicationContext.xml");
    		UserDao userDao = (UserDao) applicationContext.getBean("userDao");
    		userDao.save();
    	}
    
    }
    

    最后,运行以上demo03单元测试方法,Eclipse控制台就会打印出如下内容。
    在这里插入图片描述

    展开全文
  • org.spring-framework-3.0.4. 所有jar

    千次下载 热门讨论 2013-04-26 18:45:57
    org.springframework.aop-3.0.4.RELEASE.jar org.springframework.asm-3.0.4.RELEASE.jar org.springframework.aspects-3.0.4.RELEASE.jar org.springframework.beans-3.0.4.RELEASE.jar org.springframework....
  • Spring+3.x企业应用开发实战光盘源码(全)

    千次下载 热门讨论 2012-03-27 17:21:58
    第1章:对Spring框架进行宏观性的概述,力图使读者建立起对Spring整体性的认识。  第2章:通过一个简单的例子展现开发Spring Web应用的整体过程,通过这个实例,读者可以快速跨入Spring Web应用的世界。  第3章:...
  • spring MVC框架所需的所有jar包。(完整版)

    千次下载 热门讨论 2016-07-29 11:28:45
    该压缩包中包含了配置spring MVC框架所需的所有jar包。
  • Spring Cloud Alibaba与Spring Boot、Spring Cloud版本对应关系

    万次阅读 多人点赞 2020-04-21 10:55:00
    在搭建SpringCloud项目环境架构的时候,Springboot版本与SpringCloud版本对应关系很重要,如果版本不对应,常见的会遇见项目启动不起来,怪异的会是项目出现一些诡异的问题。 Release train Spring Boot ...
  • Spring Framework 4.x Reference Documentation 中文翻译

    千次下载 热门讨论 2015-12-14 10:49:32
    Spring Framework 4.x Reference Documentation 中文翻译 Chinese translation of the Spring Framework 4.x Reference Documentation ...
  • spring + springmvc + mybatis 整合 及 mybatis-pagehelper分页

    千次下载 热门讨论 2015-11-18 16:08:27
    spring + springmvc + mybatis 整合 demo 及 mybatis-pagehelper分页 demo
  • spring-data-redis.jar

    千次下载 热门讨论 2016-06-24 17:58:03
    spring-data-redis.jar(包含源码包)
  • 这个SSM框架整合工程是基于IntelliJ IDEA完成的的,工程里面配置文件均有注释,可直接拷贝使用(工程代码可导入IDEA中直接运行)
  • 前言:为什么要学习Spring框架? 为什么要学习Spring框架呐? (1)使用广泛:现在很多的企业都有Spring的影子,不管是SSM、SSH,还是特别流行的Spring Boot都有它美丽的影子。 (2)基于设施:Spring已经成为和...
  • 最简单的用户登录与注册系统 spring mvc spring jdbc

    千次下载 热门讨论 2014-11-03 10:51:01
    spring4.0.5版本开发的,spring mvc,spring jdbc,最简单的用户登录,注册和修改的系统。适合初学者学习。
  • spring boot+thymeleaf+bootstrap 简单实现后台管理系统界面(看评论酌情下载)
  • Spring框架学习心得(1)

    万次阅读 2021-11-10 21:49:44
    Spring <dependencies> <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,421,219
精华内容 1,368,487
关键字:

spring