iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Spring框架的小技巧
  • 312
分享到

Spring框架的小技巧

2024-04-02 19:04:59 312人浏览 八月长安
摘要

这篇文章主要介绍了spring框架的小技巧,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。Spring框架在面试中是一个必问点,里面究竟有哪些内容

这篇文章主要介绍了spring框架的小技巧,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。

Spring框架在面试中是一个必问点,里面究竟有哪些内容呢?让我们一起来看看。这也是我在面试中经常会问到的问题,也是体现一个程序员对框架理解的能力。

介绍一下Spring框架

Spring是一种轻量级框架,旨在提高开发人员的开发效率以及系统的可维护性。

我们一般说的Spring框架就是Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发。这些模块是核心容器、数据访问/集成、WEBaop(面向切面编程)、工具、消息和测试模块。比如Core Container中的Core组件是Spring所有组件的核心,Beans组件和Context组件是实现ioc和DI的基础,AOP组件用来实现面向切面编程。

Spring的6个特征:

  • 核心技术:依赖注入(DI),AOP,事件(Events),资源,i18n,验证,数据绑定,类型转换,SpEL;
  • 测试:模拟对象,TestContext框架,Spring mvc测试,WebTestClient;
  • 数据访问:事务,DAO支持,JDBC,ORM,编组XML;
  • Web支持:Spring MVC和Spring WebFlux Web框架;
  • 集成:远程处理,JMS,JCA,JMX,电子邮件,任务,调度,缓存
  • 语言:Kotlin,Groovy,动态语言;

列举一些重要的Spring模块

下图对应的是Spring 4.x的版本,目前最新的5.x版本中Web模块的Portlet组件已经被废弃掉,同时增加了用于异步响应式处理的WebFlux组件。

  • Spring Core:基础,可以说Spring其他所有的功能都依赖于该类库。主要提供ioC和DI功能。
  • Spring Aspects:该模块为与AspectJ的集成提供支持。
  • Spring AOP:提供面向方面的编程实现。
  • Spring JDBC:Java数据库连接。
  • Spring JMS:Java消息服务。
  • Spring ORM:用于支持Hibernate等ORM工具。
  • Spring Web:为创建Web应用程序提供支持。
  • Spring Test:提供了对JUnit和TestNG测试的支持。

谈谈自己对于Spring IOC和AOP的理解

IOC

IOC(Inversion Of Controll,控制反转)是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由给Spring框架来管理。IOC在其他语言中也有应用,并非Spring特有。IOC容器是Spring用来实现IOC的载体,IOC容器实际上就是一个Map(key, value),Map中存放的是各种对象。

将对象之间的相互依赖关系交给IOC容器来管理,并由IOC容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。IOC容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。在实际项目中一个Service类可能由几百甚至上千个类作为它的底层,假如我们需要实例化这个Service,可能要每次都搞清楚这个Service所有底层类的构造函数,这可能会把人逼疯。如果利用IOC的话,你只需要配置好,然后在需要的地方引用就行了,大大增加了项目的可维护性且降低了开发难度。

Spring时代我们一般通过XML文件来配置Bean,后来开发人员觉得用XML文件来配置不太好,于是Sprng Boot注解配置就慢慢开始流行起来。Spring框架的小技巧

AOP

AOP(Aspect-Oriented Programming,面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可扩展性和可维护性。

Spring AOP是基于动态代理的,如果要代理的对象实现了某个接口,那么Spring AOP就会使用jdk动态代理去创建代理对象;而对于没有实现接口的对象,就无法使用JDK动态代理,转而使用CGlib动态代理生成一个被代理对象的子类来作为代理。

当然也可以使用AspectJ,Spring AOP中已经集成了AspectJ,AspectJ应该算得上是Java生态系统中最完整的AOP框架了。使用AOP之后我们可以把一些通用功能抽象出来,在需要用到的地方直接使用即可,这样可以大大简化代码量。我们需要增加新功能也方便,提高了系统的扩展性。日志功能、事务管理和权限管理等场景都用到了AOP。

Spring AOP和AspectJ AOP的区别

Spring AOP是属于运行时增强,而AspectJ是编译时增强。Spring AOP基于代理(Proxying),而AspectJ基于字节码操作(Bytecode Manipulation)。

Spring AOP已经集成了AspectJ,AspectJ应该算得上是Java生态系统中最完整的AOP框架了。AspectJ相比于Spring AOP功能更加强大,但是Spring AOP相对来说更简单。

如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择AspectJ,它比SpringAOP快很多。

Spring中的bean的作用域有哪些?

  1. singleton:唯一bean实例,Spring中的bean默认都是单例的。
  2. prototype:每次请求都会创建一个新的bean实例。
  3. request:每一次Http请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。
  4. session:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP session内有效。
  5. global-session:全局session作用域,仅仅在基于Portlet的Web应用中才有意义,Spring5中已经没有了。Portlet是能够生成语义代码(例如html)片段的小型JAVA WEB插件。它们基于Portlet容器,可以像Servlet一样处理HTTP请求。但是与Servlet不同,每个Portlet都有不同的会话。

Spring中的单例bean的线程安全问题了解吗?

大部分时候我们并没有在系统中使用多线程,所以很少有人会关注这个问题。单例bean存在线程问题,主要是因为当多个线程操作同一个对象的时候,对这个对象的非静态成员变量的写操作会存在线程安全问题。

有两种常见的解决方案:

  1. 在bean对象中尽量避免定义可变的成员变量(不太现实)。
  2. 在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在ThreadLocal中(推荐的一种方式)。

Spring中的bean生命周期?

  1. Bean容器找到配置文件中Spring Bean的定义。
  2. Bean容器利用Java Reflection api创建一个Bean的实例。
  3. 如果涉及到一些属性值,利用set()方法设置一些属性值。
  4. 如果Bean实现了BeanNameAware接口,调用setBeanName()方法,传入Bean的名字。
  5. 如果Bean实现了BeanClassLoaderAware接口,调用setBeanClassLoader()方法,传入ClassLoader对象的实例。
  6. 如果Bean实现了BeanFactoryAware接口,调用setBeanClassFacotory()方法,传入ClassLoader对象的实例。
  7. 与上面的类似,如果实现了其他*Aware接口,就调用相应的方法。
  8. 如果有和加载这个Bean的Spring容器相关的BeanPostProcessor对象,执行postProcessBeforeInitialization()方法。
  9. 如果Bean实现了InitializingBean接口,执行afeterPropertiesSet()方法。
  10. 如果Bean在配置文件中的定义包含init-method属性,执行指定的方法。
  11. 如果有和加载这个Bean的Spring容器相关的BeanPostProcess对象,执行postProcessAfterInitialization()方法。
  12. 当要销毁Bean的时候,如果Bean实现了DisposableBean接口,执行destroy()方法。
  13. 当要销毁Bean的时候,如果Bean在配置文件中的定义包含destroy-method属性,执行指定的方法。Spring框架的小技巧

说说自己对于Spring MVC的了解?

谈到这个问题,我们不得不提提之前Model1和Model2这两个没有Spring MVC的时代。

**Model1时代:**很多学Java比较晚的后端程序员可能并没有接触过Model1模式下的javaweb应用开发。在Model1模式下,整个Web应用几乎全部用jsP页面组成,只用少量的JavaBean来处理数据库连接,访问等操作。这个模式下JSP即是控制层又是表现层。显而易见,这种模式存在很多问题。比如将控制逻辑和表现逻辑混杂在一起,导致代码重用率极低;又比如前端和后端相互依赖,难以进行测试并且开发效率极低。

Model2时代:学过Servlet并做过相关Demo的朋友应该了解Java Bean(Model)+JSP(View)+Servlet(Controller)这种开发模式,这就是早期的Java Web MVC开发模式。Model是系统中涉及的数据,也就是dao和bean;View是用来展示模型中的数据,只是用来展示;Controller是将用户请求都发送给Servlet做处理,返回数据给JSP并展示给用户。

Model2模式下还存在很多问题,Model2的抽象和封装程度还远远不够,使用Model2进行开发时不可避免地会重复造轮子,这就大大降低了程序的可维护性和可复用性。于是很多Java web开发相关的MVC框架应运而生,比如Struts2,但是由于Struts2比较笨重,随着Spring轻量级开发框架的流行,Spring生态圈出现了Spring MVC框架。Spring MVC是当前最优秀的MVC框架,相比于Struts2,Spring MVC使用更加简单和方便,开发效率更高,并且Spring MVC运行速度更快。

MVC是一种设计模式,Spring MVC是一款很优秀的MVC框架。Spring MVC可以帮助我们进行更简洁的Web层的开发,并且它天生与Spring框架集成。Spring MVC下我们一般把后端项目分为Service层(处理业务)、Dao层(数据库操作)、Entity层(实体类)、Controller层(控制层,返回数据给前台页面)。

Spring MVC的简单原理图如下:

谈谈Spring MVC的工作原理

流程说明:

1.客户端(浏览器)发送请求,直接请求到DispatcherServlet。

2.DispatcherServlet根据请求信息调用HandlerMapping,解析请求对应的Handler。

3.解析到对应的Handler(也就是我们平常说的Controller控制器)。

4.HandlerAdapter会根据Handler来调用真正的处理器来处理请求和执行相对应的业务逻辑。

5.处理器处理完业务后,会返回一个ModelAndView对象,Model是返回的数据对象,View是逻辑上的View。

6.ViewResolver会根据逻辑View去查找实际的View。

7.DispatcherServlet把返回的Model传给View(视图渲染)。

8.把View返回给请求者(浏览器)。

##Spring框架中用到了哪些设计模式?

  1. 工厂设计模式:Spring使用工厂模式通过BeanFactory和ApplicationContext创建bean对象。
  2. 代理设计模式:Spring AOP功能的实现。
  3. 单例设计模式:Spring中的bean默认都是单例的。
  4. 模板方法模式:Spring中的jdbcTemplate、hibernateTemplate等以Template结尾的对数据库操作的类,它们就使用到了模板模式。
  5. 包装器设计模式:我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
  6. 观察者模式:Spring事件驱动模型就是观察者模式很经典的一个应用。
  7. 适配器模式:Spring AOP的增强或通知(Advice)使用到了适配器模式、Spring MVC中也是用到了适配器模式适配Controller。

@Component和@Bean的区别是什么?

  1. 作用对象不同。@Component注解作用于类,而@Bean注解作用于方法。
  2. @Component注解通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中(我们可以使用@ComponentScan注解定义要扫描的路径)。@Bean注解通常是在标有该注解的方法中定义产生这个bean,告诉Spring这是某个类的实例,当我需要用它的时候还给我。
  3. @Bean注解比@Component注解的自定义性更强,而且很多地方只能通过@Bean注解来注册bean。比如当引用第三方库的类需要装配到Spring容器的时候,就只能通过@Bean注解来实现。

@Bean注解的使用示例:

@Configurationpublic class AppConfig {    @Bean    public TransferService transferService() {        return new TransferServiceImpl();    }}复制代码

上面的代码相当于下面的XML配置:

<beans>    <bean id="transferService" class="com.common.TransferServiceImpl"/></beans>复制代码

下面这个例子是无法通过@Component注解实现的:

@Beanpublic OneService getService(status) {    case (status)  {        when 1:                return new serviceImpl1();        when 2:                return new serviceImpl2();        when 3:                return new serviceImpl3();    }}复制代码

将一个类声明为Spring的bean的注解有哪些?

我们一般使用@Autowired注解去自动装配bean。而想要把一个类标识为可以用@Autowired注解自动装配的bean,可以采用以下的注解实现:

  1. @Component注解。通用的注解,可标注任意类为Spring组件。如果一个Bean不知道属于哪一个层,可以使用@Component注解标注。
  2. @Repository注解。对应持久层,即Dao层,主要用于数据库相关操作。
  3. @Service注解。对应服务层,即Service层,主要涉及一些复杂的逻辑,需要用到Dao层(注入)。
  4. @Controller注解。对应Spring MVC的控制层,即Controller层,主要用于接受用户请求并调用Service层的方法返回数据给前端页面。

Spring事务管理的方式有几种?

  1. 编程式事务:在代码中硬编码(不推荐使用)。
  2. 声明式事务:在配置文件中配置(推荐使用),分为基于XML的声明式事务和基于注解的声明式事务。

Spring事务中的隔离级别有哪几种?

在TransactionDefinition接口中定义了五个表示隔离级别的常量:

**ISOLATION_DEFAULT:**使用后端数据库默认的隔离级别,Mysql默认采用的REPEATABLE_READ隔离级别;oracle默认采用的READ_COMMITTED隔离级别。

**ISOLATION_READ_UNCOMMITTED:**最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。

**ISOLATION_READ_COMMITTED:**允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生

**ISOLATION_REPEATABLE_READ:**对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

**ISOLATION_SERIALIZABLE:**最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

Spring事务中有哪几种事务传播行为?

在TransactionDefinition接口中定义了八个表示事务传播行为的常量。

支持当前事务的情况:

**PROPAGATION_REQUIRED:**如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。

PROPAGATION_SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。

PROPAGATION_MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)。

不支持当前事务的情况:

PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。

PROPAGATION_NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,则把当前事务挂起。

PROPAGATION_NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常。

###其他情况:

PROPAGATION_NESTED: 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于PROPAGATION_REQUIRED。

感谢你能够认真阅读完这篇文章,希望小编分享Spring框架的小技巧内容对大家有帮助,同时也希望大家多多支持编程网,关注编程网数据库频道,遇到问题就找编程网,详细的解决方法等着你来学习!

您可能感兴趣的文档:

--结束END--

本文标题: Spring框架的小技巧

本文链接: https://www.lsjlt.com/news/52379.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring框架的小技巧
    这篇文章主要介绍了Spring框架的小技巧,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。Spring框架在面试中是一个必问点,里面究竟有哪些内容...
    99+
    2024-04-02
  • Go开发者必备:掌握Spring框架的技巧
    Go是一门强大的编程语言,而Spring框架则是Java开发中最为流行的框架之一。尽管两者语言不同,但是作为Go开发人员,掌握Spring框架的技巧对于你的开发工作仍然是非常有益的。在本文中,我们将会介绍一些Go开发者必备的Spring框架...
    99+
    2023-07-11
    开发技术 unix spring
  • Spring框架中的函数编写技巧是什么?
    Spring框架是当今Java开发中最为流行的框架之一,它提供了全面的解决方案,包括依赖注入、面向切面编程、事务管理、数据访问等等。而在Spring框架中,函数编写技巧是非常重要的一环,本文将为大家介绍一些Spring框架中的函数编写技巧。...
    99+
    2023-08-19
    函数 bash spring
  • Spring框架中的重定向技巧你掌握了吗?
    Spring框架是一个非常流行的Java应用程序框架,它提供了许多功能和工具,帮助开发人员快速地开发高质量的Web应用程序。其中一个非常有用的功能是重定向技巧。 重定向是一种常见的Web开发技术,它允许将用户从一个URL重定向到另一个UR...
    99+
    2023-06-02
    重定向 spring numy
  • Go、Laravel和Spring框架:同步操作的工具和技巧。
    随着互联网技术的不断发展,越来越多的企业和开发者选择使用框架来加快应用程序的开发速度。目前,Go、Laravel和Spring框架是非常流行的三种框架,它们都提供了丰富的工具和技巧来实现同步操作。在本文中,我们将介绍这三种框架的同步操作工具...
    99+
    2023-07-09
    laravel spring 同步
  • Spring框架核心概念小结
    目录1、Spring是什么2、Spring框架的优点是什么3、什么是SpringBeanSpringbean的不同作用域:4、SpringIoC容器有两种不同类型的容器:Applic...
    99+
    2024-04-02
  • Java编程中的索引技巧:Spring框架的实现方式是什么?
    在Java编程中,索引是一个重要的概念,它可以帮助我们快速地访问和查找数据。在Java编程中,常用的索引包括数组索引和Map索引。而在Spring框架中,索引也被广泛地应用,用于快速地访问Bean对象、注入依赖关系和处理请求等。 本文将介...
    99+
    2023-06-30
    索引 spring 编程算法
  • 关于Spring MVC小技巧有哪些
    这篇文章主要讲解了“关于Spring MVC小技巧有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“关于Spring MVC小技巧有哪些”吧!1.使用@Controller构造型这是创建可...
    99+
    2023-06-16
  • 轻松掌握CSS框架的实用技巧
    高效实用:掌握CSS框架的使用技巧,需要具体代码示例 前言:在现代web开发中,CSS框架是一种非常有用的工具。它提供了一套预定义的CSS样式和布局,可以帮助开发人员快速构建出漂亮且响应式的网页。本文将介绍一些常见的CSS框架,...
    99+
    2024-01-16
    使用技巧 CSS框架
  • 掌握Unix系统下使用Go语言和Spring框架的开发技巧
    随着互联网技术的发展,开发人员对于不同编程语言和框架的需求也越来越多样化。在Unix系统下,使用Go语言和Spring框架进行开发已成为越来越流行的选择。本文将介绍如何掌握这些技巧,以及如何在开发过程中克服一些常见问题。 一、Go语言的使...
    99+
    2023-07-11
    开发技术 unix spring
  • 数组框架的优化:Go和Bash的技巧和技术。
    数组是计算机科学中最常用的数据结构之一。它是一组有序的元素,这些元素可以通过索引访问。然而,在大型项目中使用数组时,可能会遇到性能问题。在本文中,我们将讨论如何优化数组框架的性能,特别是在Go和Bash语言中。 一、Go语言中的数组框架优化...
    99+
    2023-11-05
    bash 数组 框架
  • CSS框架和排版技巧的用法比较
    CSS框架常常被用来加速网页的开发,提高开发效率。但是它们的使用方式和传统的CSS排版不同,需要我们认真研究。本文将解读CSS框架与传统的CSS排版的不同使用方式及技巧,并附上具体的代码示例。 CSS框架的基本概念CSS框架是一...
    99+
    2024-01-16
    在进行排版时
  • TP3框架中index.php隐藏技巧分享
    对不起,我无法直接提供写作内容与代码。我可以为您提供关于如何使用TP3框架中的index.php隐藏技巧的指导和提示,您可以参考后自行撰写文章。您是否需要这方面的帮助呢?以上就是TP3...
    99+
    2024-04-02
  • HTML框架的艺术:提升Web设计技巧
    HTML框架是创建和管理网站结构和布局的基础。通过熟练掌握HTML框架,Web设计人员可以提升其技能,打造美观、高效且响应式的网站。 HTML框架的优势 结构清晰:框架定义了网站的结构,为内容提供清晰的组织。 布局灵活性:框架可以灵活调...
    99+
    2024-04-02
  • SEO框架型网页的优化技巧是什么
    小编给大家分享一下SEO框架型网页的优化技巧是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是框架型网页 如果一个网页的左边导航菜单是固定的,而页面中间的...
    99+
    2023-06-10
  • Laravel 框架中 ASP 缓存的使用技巧分享。
    Laravel 框架中 ASP 缓存的使用技巧分享 在 Laravel 框架中, ASP 缓存是一个非常重要的组件,它可以大大提高网站的访问速度。ASP 缓存是一种内存缓存,它可以将经常访问的数据缓存在内存中,当用户再次访问该数据时,直接从...
    99+
    2023-06-08
    缓存 linux laravel
  • Java 自定义Spring框架以及Spring框架的基本使用
    从现在开始,大家可以跟随着我的脚步来自定义一个属于自己的Spring框架。但是,在学习自定义Spring框架之前,我们得先来回顾一下Spring框架的基本使用。知晓了Spring框架...
    99+
    2024-04-02
  • 揭开Phalcon框架的秘密:性能优化技巧
    缓存优化 利用Phalcon的内置缓存组件:Phalcon 提供了一个强大的缓存系统,可以通过其 PhalconCache 组件配置和使用。利用此组件可以显着减少数据库调用和页面生成时间。 使用opcode缓存:Opcode 缓存将 P...
    99+
    2024-03-13
    Phalcon框架
  • uniapp的ui框架,小程序ui框架
    分类          uniapp能使用的ui框架分为vue组件框架和原生小程序框架。官方说明:小程序组件不是vue组件,并且每家小程序都有自己的组件规范,比如微信小程序的组件是wxml格式。小程序组件不是全端可用,支持度最广的微信小...
    99+
    2023-10-28
    uni-app ui 小程序
  • 轻松应对 ASP 框架并发请求的技巧!
    ASP框架是一个广泛应用的Web开发框架,它的高效性和稳定性深受开发者喜爱。然而,随着应用程序的不断发展,大量的并发请求可能会对ASP框架造成影响,导致程序的性能下降。在这篇文章中,我们将探讨一些轻松应对ASP框架并发请求的技巧,以确保您的...
    99+
    2023-08-08
    框架 并发 shell
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作