spirng 的总结

本文概述了Spring作为JAVAEE领域的轻量级框架,强调其降低复杂度、提升开发效率的特点,深入解析了IoC和AOP的概念,以及Spring在持久层事务管理和简化编程方面的应用,包括事务传播行为和配置方法。
摘要由CSDN通过智能技术生成

Spring的总结

1.spring是什么

​ spring是一个在JAVAEE的领域中,轻量级的,开源的AOP和IOC的框架

2.spring能干什么

​ spring可以让我们在开发中降低项目的复杂度,降低开发的难度和周期,可以粘合大量的第三方工具,降低各自的耦合度,提升了我们的开发效率。

3.spring的优点

  1. 高内聚,低耦合
  2. 声明式事务管理的支持
  3. AOP的支持
  4. 方便集成各种优秀框架
  5. 降低了JAVA EE 的API 的使用难度
  6. 方便程序的测试

4.IOC是什么

​ IOC就是Inversion of Control控制反转,是一种设计的概念。简单来说就是把开发者创建对象的这个权利交给了容器本身,这个权利的互换就叫做控制反转

​ 而说到了IOC,就不得不说DI了,DI就是依赖注入。通过控制反转,我们创建对象已经交由容器本身来处理了,那么容器创建的bean中的属性注入和引用,就叫做依赖注入。

5.AOP是什么

​ AOP就是aspect of programming ,直译的话就是面向切面编程。是通过预编译或者运行期间,利用动态代理技术实现了程序的功能统一添加和管理。

​ AOP可以实现的功能大概有如下

  • ​ 日志管理
  • ​ 事务管理
  • ​ 监控统计
  • ​ 安全控制
  • ​ 异常处理

​ AOP实际上也就是使用了动态代理的技术,而我们实现动态代理的方式有哪些?

  1. ​ java自带的动态代理类proxy (这个代理方式代理的对象必须得继承了接口)

    如下演示

    package com.demo.service;
    public interface IPersonService {
        public void test(int a,int b);
    }
    
    
    package com.demo.service;
    public class PersonService implements IPersonService{
        @Override
        public void test(int a, int b) {
            System.out.println(a+b);
        }
    }
    
    
    package com.demo.service;
    public class Demo1 {
        public static void main(String[] args) {
            IPersonService personService = new PersonService();
            personService.test(1,1);//结果2
        }
    }
    

    然后我增加一个代理类

    package com.demo.service;
    public class PersonProxy implements InvocationHandler {
        private Object instance;
        public PersonProxy(Object instance){
            this.instance = instance;
        }
        @Override
        public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
            System.out.println(Arrays.toString(objects));// [1,1]
            //我们可以在代理过程中对目标方法进行通知,增强
            objects[0] = 2;
            return method.invoke(instance,objects);
        }
    }
    
    //测试类代码修改
    package com.demo.service;
    public class Demo1 {
        public static void main(String[] args) {
            IPersonService personService = new PersonService();
            personService =(IPersonService)Proxy.newProxyInstance(personService.getClass().getClassLoader(),personService.getClass().getInterfaces(), new PersonProxy(personService));
            personService.test(1,1);// 结果是3
        }
    }
    
  2. ​ cglib(需要导入包)的技术

    这个就不再演示(我也不会啊),在spring中大量使用到了这个技术,因为这种代理方式不需要用到接口

6.AOP的核心概念

  1. ​ pointcut(切入点)

    pointcut指的是将要执行advice的方法

  2. ​ aspect(切面)

    包含了pointcut的定义和advice的定义

  3. ​ Joinpoint(连接点)

    所有可以被通知的方法

  4. ​ advice(通知)

    通知也可以理解为增强,就是在切入点方法执行的前后或者过程中,执行一些特定的代码

    通知的类型有如下几种:

    1. 前置通知(before)
    2. 环绕通知(around)
    3. 后置通知(after-returnning)
    4. 异常通知(after-throwing)
    5. 最终通知(after)
    6. 引介通知(DeclareParents)少用
  5. ​ weaving(织入)

    织入是指目标方法被通知增强的过程

  6. ​ target(目标对象)

    被通知的对象

7.spring对于持久层的支持

​ spring有JDBC的模版,虽然我们通常会使用到mybatis去操作数据库,但是spring也是可以单独支持对于数据库的一个操作。

​ 而基于AOP,spring可以对我们的事务管理做了许多简化,让我们更为方便地去管理我们的事务

​ 我们可以通过方便地XML配置或者注解配置来实现我们对于事务的管理。

​ spring对于事务的传播行为定义了7种。

​ Spring 定义了如下七中传播行为,这里以A业务和B业务之间如何传播事务为例说明:

   /*
    PROPAGATION_REQUIRED , required , 必须
    支持当前事务,A如果有事务,B将使用该事务。
    如果A没有事务,B将创建一个新的事务。

    PROPAGATION_SUPPORTS ,supports ,支持
    支持当前事务,A如果有事务,B将使用该事务。
    如果A没有事务,B将以非事务执行。

    PROPAGATION_MANDATORY,mandatory ,强制
    支持当前事务,A如果有事务,B将使用该事务。
    如果A没有事务,B将抛异常。

    PROPAGATION_REQUIRES_NEW , requires_new ,必须新的
    如果A有事务,将A的事务挂起,B创建一个新的事务
    如果A没有事务,B创建一个新的事务

    PROPAGATION_NOT_SUPPORTED ,not_supported ,不支持
    如果A有事务,将A的事务挂起,B将以非事务执行
    如果A没有事务,B将以非事务执行

    PROPAGATION_NEVER ,never,从不
    如果A有事务,B将抛异常
    如果A没有事务,B将以非事务执行
 
    PROPAGATION_NESTED ,nested ,嵌套
    A和B底层采用保存点机制,形成嵌套事务。
 */

对于事务的配置,开启事务的注解驱动。使用注解@Transactional其中可以指定事务回滚的异常类型(Roll back for),定义传播行为(propagation)等

  <bean id="transactionManager" class="org.springframework.jdbc.support.JdbcTransactionManager">
      <property name="dataSource" value="dataSource"/>
  </bean> 
 <tx:annotation-driven transaction-manager="transactionManager"/>

使用XML配置则需要定义advice配置事务的切入点以及相关的属性

  <tx:advice transaction-manager="transactionManager" id="tx_advice">
    <tx:attributes>
      <tx:method name="update*" propagation="REQUIRED" rollback-for="Exception.class"/>
    </tx:attributes>
  </tx:advice>

  <aop:config>
    <aop:advisor advice-ref="tx_advice" pointcut="execution(* com.demo.service.*.*(..))"/>
  </aop:config>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值