Spring 框架的学习心得

Spring 框架作为 JavaEE 开发的灵魂框架,以下是我在学习 Spring 框架时写下的一些总结和个人心得。

概述

Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:
反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层 Spring
MVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多
著名的第三方框架和类库,逐渐成为使用最多的 Java EE 企业应用开源框架。

Spring 的优势所在

  • 方便解耦,简化开发

    • 通过 Spring 提供的 IoC 容器,可以将对象间的依赖关系交由 Spring 进行控制,避免硬编码所造成的过度程序耦合。因为 Spring 通过 DI (依赖注入)将对象的创建交给了 Spring 来实现,避免了我们过多的使用 new 关键字来创建对象。用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可
      以更专注于上层的应用。
  • AOP 编程的支持

    • 通过 Spring 的 AOP 功能,方便进行面向切面的编程,许多不容易用传统 OOP 实现的功能可以通过 AOP 轻松应付。将一些重复的代码(用于增强功能的代码)抽取出来,在不修改源码的情况下对其进行增强。
  • 声明式事务的支持

    • 可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务的管理,提高开发效率和质量。
  • 方便程序的测试

    • 可以用非容器依赖的编程方式进行几乎所有的测试工作。

IoC

IoC 全称 Inversion Of Control 即控制反转。我的理解就是在之前我们对象都是自己创建的,也就是使用 new 关键字创建的,而现在我们不去自己创建对象了,而是让框架去帮我们创建对象。它的目的就是为了程序解耦,当然它也只能是削减程序的耦合性,并不是完全消除,毕竟不可能完全消除掉程序的耦合性。框架实现的方式就是依赖注入即 DI

DI

DI 全称 Dependency Injection 依赖注入。我们告诉框架我们要使用的类的全类名,然后在要使用的时候直接通过框架来获取这个类的实例对象。

使用方式

使用方式分为两种,xml 文件配置和注解,而且这两种方式可以结合起来使用,也是比较推荐的使用方式。毕竟纯注解或是纯配置文件的方式来使用,都是有一定的繁琐的。

配置文件的使用

首先是在配置文件中使用 bean 标签来配置让框架创建的对象。

<bean id="accountService" class="xkx.ssm.service.impl.AccountServiceImpl" scope="singleton">
  • id 给对象在容器中提供一个唯一标识。用于获取对象。
  • class 指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。
  • scope 指定对象的作用范围。常用两个属性 singleton (单例,默认值)和 prototype (多例)。

然后在需要使用这个对象时,通过以下代码来获取。

//1.使用ApplicationContext接口,就是在获取spring容器
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//2.根据bean的id获取对象
IAccountService aService = (IAccountService) ac.getBean("accountService");

注解的使用

首先是在配置文件中要告知框架使用注解是要扫描的包。

<context:component-scan base-package="xkx.ssm"></context:component-scan>

然后在需要让框架创建的类上面加一个注解,并且给这个对象指定一个标识。

@Component("accountService")

它有三个子注解,分别对应着我们的三层框架,这三个子注解并没有特殊的作用,但是推荐对应着使用。

  • @Controller 对应着 web 层
  • @Service 对应着业务层
  • @Repository 对应着持久层

最后在需要使用的时候,使用注解将其注入即可。注入的注解有三个。

  • @Autowired 自动按照类型注入。
  • @Qualifier 在自动按照类型注入的基础之上,再按照Bean的id注入。它在给字段注入时不能独立使用,必须和上一个注解一起使用;但是给方法参数注入时,可以独立使用。
  • @Resource 直接按照Bean的id注入。

一般情况下,我们自己写的类都是通过注解的方式来使用,而导入类就是通过配置的方式来使用。

AOP

AOP:全称是 Aspect Oriented Programming 即:面向切面编程。简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强。

使用方式

配置的方式

<!-- 配置通知 -->
<bean id="txManager"class="xkx.ssm.utils.TransactionManager"><property name="dbAssit" ref="dbAssit"></property>
</bean>
<aop:config><!-- 配置切入点表达式 id属性用于指定表达式的唯一标识。expression属性用于指定表达式内容此标签写在aop:aspect标签内部只能当前切面使用。它还可以写在aop:aspect外面,此时就变成了所有切面可用--><aop:pointcut id="pt1" expression="execution(* xkx.ssm.service.impl.*.*(..))"></aop:pointcut><!--配置切面 --><aop:aspect id="logAdvice" ref="logger"><!-- 配置前置通知:在切入点方法执行之前执行<aop:before method="beforePrintLog" pointcut-ref="pt1" ></aop:before>--><!-- 配置后置通知:在切入点方法正常执行之后值。它和异常通知永远只能执行一个<aop:after-returning method="afterReturningPrintLog" pointcut-ref="pt1"></aop:after-returning>--><!-- 配置异常通知:在切入点方法执行产生异常之后执行。它和后置通知永远只能执行一个<aop:after-throwing method="afterThrowingPrintLog" pointcut-ref="pt1"></aop:after-throwing>--><!-- 配置最终通知:无论切入点方法是否正常执行它都会在其后面执行<aop:after method="afterPrintLog" pointcut-ref="pt1"></aop:after>--><!-- 配置环绕通知--><aop:around method="aroundPringLog" pointcut-ref="pt1"></aop:around></aop:aspect>
</aop:config>
  • 其实我的理解就是将一些重复的代码提取出来写在一个类中(即通知类),然后在我们要使用它的时候,在配置的切面中去声明它是在切入点(即源代码的方法)之前还是之后使用。

注解的方式

首先在配置文件中开启spring对注解AOP的支持

<aop:aspectj-autoproxy/>

在通知类上面写上一个注解 @Aspect 声明它是一个切面类。

然后在它的方法上写上注解来声明它是什么通知,对应着分别有五个注解

  • @Before 前置通知
  • @AfterReturning 后置通知
  • @AfterThrowing 异常通知
  • @After 最终通知
  • @Around 环绕通知

声明式事务控制

一般情况下都是通过 xml 文件配置来声明事务控制的,因为可以一劳永逸。

<!-- 配置事务管理器 -->
<beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property>
</bean><!-- 配置事务的通知--><tx:advice id="txAdvice" transaction-manager="transactionManager"><!-- 配置事务的属性isolation:用于指定事务的隔离级别。默认值是DEFAULT,表示使用数据库的默认隔离级别。propagation:用于指定事务的传播行为。默认值是REQUIRED,表示一定会有事务,增删改的选择。查询方法可以选择SUPPORTS。read-only:用于指定事务是否只读。只有查询方法才能设置为true。默认值是false,表示读写。timeout:用于指定事务的超时时间,默认值是-1,表示永不超时。如果指定了数值,以秒为单位。rollback-for:用于指定一个异常,当产生该异常时,事务回滚,产生其他异常时,事务不回滚。没有默认值。表示任何异常都回滚。no-rollback-for:用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时事务回滚。没有默认值。表示任何异常都回滚。--><tx:attributes><tx:method name="*" propagation="REQUIRED" read-only="false"/><tx:method name="find*" propagation="SUPPORTS" read-only="true"></tx:method></tx:attributes></tx:advice><!-- 配置aop--><aop:config><!-- 配置切入点表达式--><aop:pointcut id="pt1" expression="execution(* xkx.ssm.service.impl.*.*(..))"></aop:pointcut><!--建立切入点表达式和事务通知的对应关系 --><aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"></aop:advisor></aop:config>

Spring 框架的学习心得相关推荐

  1. Spring框架基础学习小结。概念,文件配置

    spring框架 百度概念一大堆,我之阐述自己的理解. 概念:分层的轻量级的开源框架.两大内核为IOC(反转控制:将创建对象交给spring框架处理)和AOP(面向切面编程:对动态代理的再次增强) 分 ...

  2. 轻松理解Spring框架的基本思想

    说起Spring框架,就不得不说J2EE的EJB.年龄稍大一些的Java程序员对J2EE的EJB还是记忆犹新的,当时使用EJB开发大型应用系统非常时髦,Java程序员无不以掌握EJB开发技术为自豪,程 ...

  3. Spring框架第一天

    ## 今天课程:Spring框架第一天 ## ---------- **Spring框架的学习路线** 1. Spring第一天:Spring的IOC容器之XML的方式,Spring框架与Web项目整 ...

  4. spring mvc后端代码实现弹出对话框_伟源|一图搞定Spring框架

    很多朋友都问济宏同学,现在流行的Java到底是什么鬼?如何快速入门,快速上手? 济宏同学也在网上找了很多文章,但是没有一个文章能说得清楚.所以,济宏同学只好通过脑图方式,给小白们给一个Java现在最流 ...

  5. Java学习心得及学习顺序

    刚开始学习java时间不长,感觉有点不知道怎么学习,不知到按照怎样的顺序学习,后来请教了一些已经工作的大神,他告诉我一定要按照阶段性学习,一个阶段一阶段打好基础.虽然很多网站都有很多学习视频,但还是给 ...

  6. 超详细的Spring框架讲解,就这一篇!足矣

    spring框架的学习笔记,以及演示代码. Spring框架概述 1.什么是Spring 2.Spring框架的优点 3.Spring框架体系结构 Spring框架--控制反转(IOC) 1.IOC介 ...

  7. Sprin框架的学习(课时七)SpringAop的学习

    目录 2022年9月9号Sprin框架的学习(课时七)Aop项内容设计23设计模式中的静态代理模式而在SpringAop中实现的时动态代理模式 第一部分 了解Java23模式的基本概念从下面的概念去理 ...

  8. 关于spring框架,看这一篇就够了~~~

    文章目录 一.Spring是什么? 1. Spring定义 2. Spring的优点 3. Spring的核心结构 4. Spring的核心思想 4.1 IOC和DI 4.2 AOP 二.IOC和AO ...

  9. spring 框架学习(一)

    1.spring简介 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成 ...

  10. spring学习12 -Spring 框架模块以及面试常见问题注解等

    以下为spring常见面试问题: 1.Spring 框架中都用到了哪些设计模式? Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的: 代理模式-在AOP和remoting中被用的比较 ...

最新文章

  1. 吴恩达深度学习代码_吴恩达深度学习笔记(58)-深度学习框架Tensorflow
  2. mysql 如何清除sql缓存
  3. php函数get和set,php中外部类调用_get函数和_set函数的方法
  4. 存根类 测试代码 java_常规单元测试和存根–测​​试技术4
  5. PHP 文件夹操作「复制、删除、查看大小」递归实现
  6. 苹果CMS v10模板最近很火的电影先生v1.0.2修复版
  7. linux c 大全,linux c 程序设计大全(吴岳) 求助
  8. ubuntu 安装nvidia 驱动后无法进入桌面(循环进入登录界面 )
  9. [转载] python单词词典_Python 字典(Dictionary)
  10. C++的性能C#的产能?! - .Net Native 系列向导
  11. Git 分支管理最佳实践(转载)
  12. ubuntupython损坏_Ubuntu上修复Python
  13. Android Studio配置文件修改
  14. 三菱PLC通用快捷键
  15. 人生苦短,我用Python;平台无限多,最棒大蟒蛇anaconda!
  16. 《linux命令行与shell编程大全》--读书笔记
  17. 数据库的“读现象”浅析
  18. ORA-16032: parameter LOG_ARCHIVE_DEST_3 destination string cannot be translated问题处理过程
  19. 从0.1加0.2不等于0.3谈Python浮点数的前世今生
  20. slidetoshutdown电脑滑动关机命令失效了怎么办?

热门文章

  1. 家庭能源管理matlab 采用matlab编制家庭能源管理程序,包括各种家用电器的调度运行策略
  2. 「建模学习」3DsMAX贴图制作方法,足球贴图案例详细教程
  3. PHP连接MYSQL没有反应
  4. SREng日志全分析(一)
  5. 搭建一个属于自己的星球-快速建站实录(1/3):域名
  6. codesmith mysql 注释_代码生成工具:CodeSmith 安装、改造适配Mysql 字段注释、DLL修改 及批量生成实体类代码...
  7. 对称加密算法基本介绍
  8. 树莓派搭建全功能NAS服务器(07):管理你的书库随心阅读
  9. 破解闪讯,让你的笔记本变成wifi基站
  10. 想考华为HCIA,但不知道选择什么方向,点进来~