Spring详解,底层原理深入探究(1)

Spring详解,底层原理深入探究(1)

1.简介

​ Spring 是目前主流的 Java Web 开发框架,该框架是一个轻量级的开源框架,具有很高的凝聚力和吸引力。由 Rod Johnson 创立,2004 年发布了 Spring 框架的第一版,其目的是用于简化企业级应用程序开发的难度和周期。

2.核心

①控制反转(IOC)和面向切面编程(Aop)

②将类交由Spring框架统一管理,自动注入并复制

③系统级服务不用手工写,避免其混杂入业务代码(例如关闭事务),改由Spring织入

3.优点

①轻量级

​ jar包小,效率高

②非侵入式

​ 不用继承Spring特定的类,Spring的代码不会进入我们的代码中

③针对接口编程

​ 对象由容器创建

④Aop编程的支持

​ 将一部分公共可重复利用的代码抽离出来,一次编程多次利用

⑤可管理其他框架

4.Spring核心之Ioc

​ Ioc就是指将原本需要手动new出来的对象的控制权交由Spring处理。

具体底层请看Spring板块的下一期内容

5.Spring核心之Aop

Aop为Aspect Oriented Programming:面向切面编程通过预编译的方式和动态代理来实现功能的统一维护

1.优点

​ 减少重复,专注业务

2.核心:使用动态代理的方式在执行方法前或出现异常后加入相关的逻辑

说到这大家或许也有些迷茫,小编带大家来看一个例子了解一下Aop

``

package com.ff.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

import org.springframework.stereotype.Component;

@Component
@Aspect
public class AopDemo {
	//save方法执行前做日志,执行后做日志,模拟做两次日志
    @Around("execution(* com.ff.dao.UserDao.save(..))")
    public void tran(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("做日志");
        proceedingJoinPoint.proceed();
        System.out.println("做日志");
    }
	//如果save方法抛出异常,则执行这个
    @AfterThrowing(value = "execution(* com.ff.dao.UserDao.save(..))",throwing = "e")
    public void throw123(Exception e) {
        System.out.println("出异常了" + e.getMessage());
    }
}

``

package com.ff.dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import java.util.Date;

@Repository(value = "userDao")
public class UserDao {
    @Autowired
    JdbcTemplate jdbcTemplate;
    
    public void save() {
        System.out.println("保存成功");
        //int i=10/0;
        jdbcTemplate.update("insert into user(user_name,birthday) values (?,?)", "yuan", new Date());
        return;
    }

}

如果注释int i=10/0;则结果为

做日志

保存成功

做日志

如果没注释int i=10/0;则结果为

做日志

保存成功

java.lang.ArithmeticException: / by zero

3.AOP 的基本概念

连接点(Joinpoint):类中可以被增强的方法,这个方法就被称为连接点

切入点(pointcut):类中有很多方法可以被增强,但实际中只有 add 和 update 被增了,那么 add 和 update 方法就被称为切入点(实际实现的连接点)

通知(Advice): 通知是指一个切面在特定的连接点要做的事情(增强的功能)。通 知分为方法执行前通知,方法执行后通知,环绕通知等.

切面(Aspect):把通知添加到切入点的过程叫切面. 目标(Target): 代理的目标对象(要增强的类) 代理(Proxy): 向目标对象应用通知之后创建的代理对象

6.Spring的事务管理

​ 事务可以看做是由对数据库若干操作组成的一个单元。 我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作 的结合。由于数据操作在顺序执行的过程中,任何一步操作都有可能发生异常, 异常会导致后续操作无法完成,此时由于业务逻辑并未正确的完成,之前成功操 作数据的并不可靠,需要在这种情况下进行回退。

1.事务特征

​ 原子性(Atomic) 一致性(Consistent) 隔离性(Insulation) 持久性(Duration)

​ 2.事务的形式

​ 编程式事务:注 入 一 个 事 务 管 理 对 象 TransactionTemplate,实现提交和回滚

​ 注解实式事务;只需要在需要事务的方法或类上配置@Transactional,配置xml如下

<!-- 配置 spring 事务管理类, 并注入数据源 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property>

`

<tx:annotation-driven transaction-manager=“transactionManager”/>`

7.事务的传播行为

事务的传播行为是指事务A方法调用事务B方法时 ,B方法的行为(加入A的事务,没有事务,还是自己建事务),由B的传播行为决定

事务的传播行为解释
PROPAGATION_REQUIRED如果当前没事务,创建一个事务,如果有则加入当前事务
PROPAGATION_SUPPORTS如果A有事务则加入,没有自己就不在事务中运行
ROPAGATION_MANDATORY使用当前事务,如果当前没有事务则抛出异常
PROPAGATION_REQUIRES_NE W无论A有没有事务都要建立一个新事务
PROPAGATION_NOT_SUPPOR TED如果A有事务则把A的事务挂起,B不在事务中执行,A没有,B也不在事务中执行
PROPAGATION_NEVER以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED如果当前存在事务,则在嵌套事务内执行。如果当前没事 务,和1相同

请关注小编下期下期主要以讲Spring底层创建原理等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值