
Spring系列教程
文章平均质量分 79
Spring系列教程
软件定制开发工作室
这个作者很懒,什么都没留下…
展开
-
Spring开发系列教程(26)——异步处理
在Servlet模型中,每个请求都是由某个线程处理,然后,将响应写入IO流,发送给客户端。从开始处理请求,到写入响应完成,都是在同一个线程中处理的。实现Servlet容器的时候,只要每处理一个请求,就创建一个新线程处理它,就能保证正确实现了Servlet线程模型。在实际产品中,例如Tomcat,总是通过线程池来处理请求,它仍然符合一个请求从头到尾都由某一个线程处理。这种线程模型非常重要,因为Spring的JDBC事务是基于实现的,如果在处理过程中,一会由线程A处理,一会又由线程B处理,那事务就全乱套了。原创 2025-04-22 22:19:28 · 1626 阅读 · 0 评论 -
Spring开发系列教程(25)——国际化
在开发应用程序的时候,经常会遇到支持多语言的需求,这种支持多语言的功能称之为国际化,英文是internationalization,缩写为i18n(因为首字母i和末字母n中间有18个字母)。还有针对特定地区的本地化功能,英文是localization,缩写为L10n,本地化是指根据地区调整类似姓名、日期的显示等。也有把上面两者合称为全球化,英文是globalization,缩写为g11n。在Java中,支持多语言和本地化是通过配合Locale。原创 2025-04-21 19:01:09 · 1151 阅读 · 0 评论 -
Spring开发系列教程(24)——处理CORS
在开发REST应用时,很多时候,是通过页面的JavaScript和后端的REST API交互。在JavaScript与REST交互的时候,有很多安全限制。a.coma.comb.com同源要求域名要完全相同(a.com和www.a.com不同),协议要相同(http和https不同),端口要相同。那么,在域名a.com页面的JavaScript要调用B站b.com的API时,还有没有办法?原创 2025-04-20 15:00:00 · 664 阅读 · 0 评论 -
Spring开发系列教程(23)——使用Interceptor
上图虚线框就是Filter2的拦截范围,Filter组件实际上并不知道后续内部处理是通过Spring MVC提供的还是其他Servlet组件,因为Filter是Servlet规范定义的标准组件,它可以应用在任何基于Servlet的程序中。如果只基于Spring MVC开发应用程序,还可以使用Spring MVC提供的一种功能类似Filter的拦截器:Interceptor。所以,Interceptor的拦截范围其实就是Controller方法,它实际上就相当于基于AOP的方法拦截。原创 2025-04-20 11:00:00 · 1061 阅读 · 0 评论 -
Spring开发系列教程(22)——集成Filter
有的童鞋在上一节的Web应用中可能发现了,如果注册时输入中文会导致乱码,因为Servlet默认按非UTF-8编码读取参数。其实和Spring的IoC容器没有任何关系,两者均互不知晓对方的存在,因此,配置这种Filter十分简单。所以,得通过一种方式,让Servlet容器实例化的Filter,间接引用Spring容器实例化的。是一个普通Bean,Servlet容器并不知道,所以它不会起作用。的实例将由Servlet容器而不是Spring容器初始化,因此,实际应用时,尽量保持名字一致,以减少不必要的配置。原创 2025-04-19 15:00:00 · 420 阅读 · 0 评论 -
Spring开发系列教程(21)——使用REST
使用Spring MVC开发Web应用程序的主要工作就是编写Controller逻辑。在Web应用中,除了需要使用MVC给用户显示页面外,还有一类API接口,我们称之为REST,通常输入输出都是JSON,便于第三方调用或者使用页面JavaScript与之交互。直接在Controller中处理JSON是可以的,因为Spring MVC的和都支持指定输入和输出的格式。注意到使用consumes声明能接收的类型,使用produces声明输出的类型,并且额外加了表示返回的String。原创 2025-04-19 10:30:00 · 268 阅读 · 0 评论 -
Spring开发系列教程(20)——Spring MVC
我们先把基于Spring MVC开发的项目结构搭建起来。以及provided其中,是标准web目录,WEB-INF存放web.xml,编译的class,第三方jar,以及不允许浏览器直接访问的View模版,static目录存放所有静态文件。在目录中存放的是Java程序读取的classpath资源文件,除了JDBC的配置文件外,我们又新增了一个上面给出了一个写入到标准输出的Logback配置,可以基于上述配置添加写入到文件的配置。在中就是我们编写的Java代码了。原创 2025-04-18 14:30:00 · 1496 阅读 · 0 评论 -
Spring开发系列教程(19)——设计ORM
我们从前几节可以看到,所谓ORM,也是建立在JDBC的基础上,通过ResultSet到JavaBean的映射,实现各种查询。有自动跟踪Entity修改的全自动化ORM如Hibernate和JPA,需要为每个Entity创建代理,也有完全自己映射,连INSERT和UPDATE语句都需要手动编写的MyBatis,但没有任何透明的Proxy。而查询是涉及到数据库使用最广泛的操作,需要最大的灵活性。原创 2025-04-18 10:15:00 · 620 阅读 · 0 评论 -
Spring开发系列教程(18)——集成MyBatis
使用Hibernate或JPA操作数据库时,这类ORM干的主要工作就是把ResultSet的每一行变成Java Bean,或者把Java Bean自动转换到INSERT或UPDATE语句的参数中,从而实现ORM。而ORM框架之所以知道如何把行数据映射到Java Bean,是因为我们在Java Bean的属性上给了足够的注解作为元数据,ORM框架获取Java Bean的注解后,就知道如何进行双向映射。那么,ORM框架是如何跟踪Java Bean的修改,以便在update()操作中更新必要的属性?原创 2025-04-17 10:40:46 · 1192 阅读 · 0 评论 -
Spring开发系列教程(17)——集成JPA
上一节我们讲了在Spring中集成Hibernate。Hibernate是第一个被广泛使用的ORM框架,但是很多小伙伴还听说过JPA:Java Persistence API,这又是啥?在讨论JPA之前,我们要注意到JavaEE早在1999年就发布了,并且有Servlet、JMS等诸多标准。原创 2025-04-17 10:37:12 · 1015 阅读 · 0 评论 -
Spring开发系列教程(16)——集成Hibernate
使用的时候,我们用得最多的方法就是。这个RowMapper的作用就是把ResultSet的一行记录映射为Java Bean。这种把关系数据库的表记录映射为Java对象的过程就是ORM:Object-Relational Mapping。ORM既可以把记录转换成Java对象,也可以把Java对象转换为行记录。使用配合RowMapper可以看作是最原始的ORM。如果要实现更自动化的ORM,可以选择成熟的ORM框架,例如。我们来看看如何在Spring中集成Hibernate。原创 2025-04-13 14:15:00 · 1304 阅读 · 0 评论 -
Spring开发系列教程(15)——DAO
在传统的多层应用程序中,通常是Web层调用业务层,业务层调用数据访问层。业务层负责处理各种业务逻辑,而数据访问层只负责对数据进行增删改查。因此,实现数据访问层就是用实现对数据库的操作。编写数据访问层的时候,可以使用DAO模式。Spring提供了一个类,用于简化DAO的实现。这个没什么复杂的,核心代码就是持有一个它的意图是子类直接从继承后,可以随时调用获得的实例。那么问题来了:因为的字段没有标记@Autowired,所以,子类想要注入有的童鞋可能看出来了:既然UserDao都已经注入了。原创 2025-04-13 10:15:00 · 491 阅读 · 0 评论 -
Spring开发系列教程(14)——声明式事务
使用Spring操作JDBC虽然方便,但是我们在前面讨论JDBC的时候,讲到过,如果要在Spring中操作事务,没必要手写JDBC事务,可以使用Spring提供的高级接口来操作事务。Spring提供了一个来表示事务管理器,所有的事务都由它负责管理。而事务由表示。如果手写事务代码,使用Spring为啥要抽象出和?原因是JavaEE除了提供JDBC事务外,它还支持分布式事务JTA(Java Transaction API)。原创 2025-04-12 14:30:00 · 1048 阅读 · 0 评论 -
Spring开发系列教程(13)——JDBC
我们在前面介绍DataSourceDataSourceConnectionConnectionResultSetint正确编写JDBC代码的关键是使用释放资源,涉及到事务的代码需要正确提交或回滚事务。在Spring使用JDBC,首先我们通过IoC容器创建并管理一个DataSource实例,然后,Spring提供了一个,可以方便地让我们操作JDBC,因此,通常情况下,我们会实例化一个。顾名思义,这个类主要使用了。编写示例代码或者测试代码时,我们强烈推荐使用。原创 2025-04-12 10:30:00 · 957 阅读 · 0 评论 -
Spring开发系列教程(12)——AOP避坑指南
无论是使用AspectJ语法,还是配合Annotation,使用AOP,实际上就是让Spring自动为我们创建一个Proxy,使得调用方能无感知地调用指定方法,但运行期却动态“织入”了其他逻辑,因此,AOP本质上就是一个。因为Spring使用了CGLIB来实现运行期动态创建Proxy,如果我们没能深入理解其运行原理和实现机制,就极有可能遇到各种诡异的问题。我们来看一个实际的例子。假设我们定义了一个再写个,并注入最后用main()下一步,我们给加上AOP支持,就添加一个最简单的别忘了在。原创 2025-04-11 14:30:00 · 983 阅读 · 0 评论 -
Spring开发系列教程(11)——AOP之使用注解装配AOP
上一节我们讲解了使用AspectJ的注解,并配合一个复杂的语法来定义应该如何装配AOP。在实际项目中,这种写法其实很少使用。假设你写了一个基本能实现无差别全覆盖,即某个包下面的所有Bean的所有方法都会被这个check()方法拦截。这种非精准打击误伤面更大,因为从方法前缀区分是否是数据库操作是非常不可取的。原创 2025-04-11 10:15:00 · 875 阅读 · 0 评论 -
Spring开发系列教程(10)——使用AOP之装配AOP
看完上述术语,是不是感觉对AOP有了进一步的困惑?其实,我们不用关心AOP创造的“术语”,只需要理解AOP本质上只是一种代理模式的实现方式,在Spring的容器中实现AOP特别方便。我们以和为例,这两个属于核心业务逻辑,现在,我们准备给的每个业务方法执行前添加日志,给的每个业务方法执行前后添加日志,在Spring中,需要以下步骤:上述依赖会自动引入AspectJ,使用AspectJ实现AOP比较方便,因为它的定义比较简单。然后,我们定义一个观察方法,我们定义了一个@Before。原创 2025-04-10 14:15:00 · 972 阅读 · 0 评论 -
Spring开发系列教程(9)——使用AOP
AOP是Aspect Oriented Programming,即面向切面编程。我们先回顾一下OOP:Object Oriented Programming,OOP作为面向对象编程的模式,获得了巨大的成功,OOP的主要功能是数据封装、继承和多态。而AOP是一种新的编程方式,它和OOP不同,OOP把系统看作多个对象的交互,AOP把系统分解为不同的关注点,或者称之为切面(Aspect)。要理解AOP的概念,我们先用OOP举例,比如一个业务组件createBook:添加新的Book;原创 2025-04-10 10:15:00 · 1096 阅读 · 0 评论 -
Spring开发系列教程(8)——IoC容器之使用条件装配
开发应用程序时,我们会使用开发环境,例如,使用内存数据库以便快速启动。而运行在生产环境时,我们会使用生产环境,例如,使用MySQL数据库。如果应用程序可以根据自身的环境做一些适配,无疑会更加灵活。Spring为应用程序准备了Profile这一概念,用来表示不同的环境。创建某个Bean时,Spring容器可以根据注解@Profile来决定是否创建。如果当前的Profile设置为test,则Spring容器会调用创建ZoneId,否则,调用创建ZoneId。注意到表示非test环境。原创 2025-04-09 14:30:00 · 399 阅读 · 0 评论 -
Spring开发系列教程(7)——IoC容器之注入配置
在开发应用程序时,经常需要读取配置文件。最常用的配置方法是以key=value的形式写在文件中。例如,根据配置的来决定使用哪个时区。要读取配置文件,我们可以使用上一节讲到的Resource来读取位于classpath下的一个文件。但是,这样仍然比较繁琐。Spring容器还提供了一个更简单的来自动读取配置文件。我们只需要在Spring容器看到注解后,自动读取这个配置文件,然后,我们使用@Valueapp.zoneapp.zoneZ这样一来,我们就可以根据app.zone的配置来创建ZoneId。原创 2025-04-09 10:15:00 · 410 阅读 · 0 评论 -
Spring开发系列教程(6)——IoC容器之使用Resource
在Java程序中,我们经常会读取配置文件、资源文件等。使用Spring容器时,我们也可以把“文件”注入进来,方便程序读取。例如,AppService需要读取logo.txt这个文件,通常情况下,我们需要写很多繁琐的代码,主要是为了定位文件,打开InputStream。Spring提供了一个(注意不是或),它可以像Stringint一样使用@Value注入Resource最常用的方式是通过classpath,即类似表示在classpath中搜索logo.txt文件,然后,我们直接调用。原创 2025-04-08 14:15:00 · 383 阅读 · 0 评论 -
Spring开发系列教程(5)——IoC容器之定制Bean
容器都返回一个新的实例,这种Bean称为Prototype(原型),它的生命周期显然和Singleton不同。默认情况下,对一种类型的Bean,容器只创建一个实例。后,它就会自动为我们创建一个单例(Singleton),即容器初始化时创建Bean,容器关闭前销毁Bean。Spring也提供了工厂模式,允许定义一个工厂,然后由工厂创建真正的Bean。可以指定创建的Bean的类型,因为指定类型不一定与实际类型一致,可以是接口或抽象类。这样,在注入时,如果没有指出Bean的名字,Spring会注入标记有。原创 2025-04-08 10:30:00 · 1012 阅读 · 0 评论 -
Spring开发系列教程(4)——IoC容器之使用Annotation配置
使用Spring的IoC容器,实际上就是通过类似XML这样的配置文件,把我们自己的Bean的依赖关系描述出来,然后让容器来创建并装配Bean。一旦容器初始化完毕,我们就直接从容器中获取Bean使用它们。使用XML配置的优点是所有的Bean都能一目了然地列出来,并通过配置注入能直观地看到每个Bean的依赖。它的缺点是写起来非常繁琐,每增加一个组件,就必须把新的Bean配置到XML中。有没有其他更简单的配置方式呢?有!原创 2025-04-07 14:15:00 · 601 阅读 · 0 评论 -
Spring开发系列教程(3)——IoC容器之装配Bean
我们前面讨论了为什么要使用Spring的IoC容器,因为让容器来为我们创建并装配Bean能获得很大的好处,那么到底如何使用IoC容器?装配好的Bean又如何使用?我们来看一个具体的用户注册登录的例子。首先,我们用Maven创建工程并引入我们先编写一个再编写一个注意到通过注入了一个。然后,我们需要编写一个特定的注意观察上述配置文件,其中与XML Schema相关的部分格式是固定的,我们只关注两个<bean ...><bean ...>id只不过Spring容器是通过读取XML文件后使用反射完成的。原创 2025-04-07 10:30:00 · 394 阅读 · 0 评论 -
Spring开发系列教程(2)——IoC容器
容器是一种为某种特定组件的运行提供必要支持的一个软件环境。例如,Tomcat就是一个Servlet容器,它可以为Servlet的运行提供运行环境。类似Docker这样的软件也是一个容器,它提供了必要的Linux环境以便运行一个特定的Linux进程。通常来说,使用容器运行组件,除了提供一个组件运行环境之外,容器还提供了许多底层服务。例如,Servlet容器底层实现了TCP连接,解析HTTP协议等非常复杂的服务,如果没有容器来提供这些服务,我们就无法编写像Servlet这样代码简单,功能强大的组件。原创 2025-04-06 14:30:00 · 761 阅读 · 0 评论 -
Spring开发系列教程(1)——简介
什么是Spring?Spring是一个支持快速开发Java EE应用程序的框架。它提供了一系列底层容器和基础设施,并可以和大量常用的开源框架无缝集成,可以说是开发Java EE应用程序的必备。Spring最早是由Rod Johnson这哥们在他的《》一书中提出的用来取代EJB的轻量级框架。随后这哥们又开始专心开发这个基础框架,并起名为Spring Framework。原创 2025-04-06 10:15:00 · 333 阅读 · 0 评论