Spring 框架的学习心得

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>
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值