27-Spring_Basic-4

1.AOP

之前在学习三期视屏的时候,有学到过面向切面编程,这里写的那么生动形象,"面向切面编程",其实就是在一个方法的"纵向"这条线上可以自由操作

这里Spring用到的AOP技术就是AspectJ框架,AOP的底层实现原理,就是动态代理

2.基于注解的AspectJ实现AOP

把需要实现切面功能类的类,声明为切面类

步骤:

         1.需要把这个切面类,放在IOC容器中@Component

         2.再声明为一个切面类@Aspect

         3.@Before表明为其在方法执行之前执行(这样的声明就叫做前置通知),然后在这个方法的括号里面,写的就是target方法-->@Before("execution(public int com........)"),如果是某个类的所有方法,那就用*

         4.这里还要写一个使AspectJ起作用的配置<aop :aspectj-autoproxy></aop:aspectj-autopoxy>,用这个实际上也就是实现了代理

3.JointPoint(切入点)

这是一个切点参数,返回的就是切面的目标对象的各种光属性,比如

这个方法的方法名:getSignature.getName()

传入这个方法的参数值Array asList(joinPoint.getArgs());

切入点就是指的被切入的那个Func

4.NameSpace

之前在配置xml文件的时候,各种选命名空间的....具体也不知道配置什么样的框架,需要什么样的命名空间,后续是肯定要学习的

5.一共5种通知

-@Before:前置通知

-@After:后置通知-->这里注意,无论这个方法是否返回异常,都会执行,这里注意,这个代码是放在finall里面的

-@AfterRunning:返回通知-->在方法返回结果以后才执行,这里还有一个object返回的实参

-@AfterThrowing:异常通知-->在方法抛出异常之后执行,这里的返回异常也可以设置异常类型,意思就是说,你可以获取到异常对象;可以可以写在获得指定异常的时候进行处理

-@Around环绕通知-->需要携带ProceedingJoinPoint,这里类似动态代理的全过程,且环绕通知必须要有返回值,这个是功能最强大的,但是功能强大并不代表,平时用到的最多,但是我感觉这几个应该都会用很多

6.切点

在通知后面的("")里面,写通知表达式的时候,有很多表达式可以写,专业点称之为-->切入点表达式

定义一个方法,用于声明切面表达式

上面备注@Pointcut("")

那么这个方法可以直接复制粘贴到之前的表达式内,如果是外部的另一个切面类的,那么就为:包名 + 类名 + 那个切面表达式方法

而不同的切面类,是肯定有优先级的,这里使用@order()后面的数字,来决定切面程序的优先级问题,值越小,优先级越高

7.xml配置AOP-->声明式的配置AOP

    1.把需要代理的bean和切面bean全部注入到IOC中

    2.写<aop:config>这里直接写expression 和 id,就是配置切点表达式以及这个表达式的id

    3.配置各种切面通知

8.jdbc

具体步骤:(这里使用的数据库管理工具是SQLjoy,我之前用的时Navicat)

    1.创建applicationContext.xml配置文件

    2.配数据源文件db.properties-->这里之前就配置了数据库信息,这里还有连接池的信息

    3.在xml的配置文件里面配置c3p0数据源dataSource

    4.把数据源的配置文件,在xml配一下,这样就把这个mySQL的数据库作为了一个数据源dataSource

    5.这里用到了Junit单元测试框架,这里新建了一个JDBCTest,这里默认有一个重写方法:@Test,这里就使用了这个JUnit,在test方法里面尝试注入dataSource元数据bean,通过测试是否能建立connection来判断,这个dataSource的Bean成功注入了IOC;这里@Test的都是测试代码

    6.配置JDBC的一个Template模板类,并注入bean,同时这个bean需要依赖dataSource的bean

    7.等于说,用template依赖了元数据bean,然后就可以用JDBCTemplate去操作数据库

    8.这里写了很多sql语句,用jdbcTemplate来执行...不会以后还要学sql语句吧...    9.这里从jdbc里面拿数据,一整条,就是一行数据,直接读出来就是一个bean,用什么RowMapper

    9.这里整篇使用的是JDBCTemplate,是jdbc的一个小工具,并不是一个ORM框架,到时候我估计操作数据库还是用MyBatis

    10.到时候,Spring的事务,一定是跟DAO层的obj是紧密耦合的

    11.这边写的,不推荐是用JdbcDaoSupport,直接使用jdbcTemplate......这里写的很多东西,后续都是直接整合ORM框架...不用纠结

9.具名参数

之前在写sql语言的时候,都是用的???,这种的话,需要一一对应,这里可以用具名参数来写sql语言...暂时还没有学Mybatis,希望到时候,直接用java去操作数据库,而不用写任何的sql...或者,至少自己封装一下吧

10.事务

英文:transaction --> tx,这里在xml里面的配置缩写就是tx,根绝读音来缩写的,跟美国人习惯有关系,比如日产奇骏-X-trail,其实是cross-trail的意思,只不过cross可以简写为"x"

废话不多说,tx是一个在spring里面非常非常核心的概念,本质上就是一个一系列动作的工作单元

事务的4个关键属性(ACID)

        -原子性-->最重要的属性,设计到回滚

        -一致性-->因为原子性,所有有一致性

        -隔离性-->线程安全

        -持久性-->事务执行的结果被写到持久化储存中.

补充一个小知识,之前一直没用到构造代码块,这里说一下,非静态的构造代码块,优于构造函数执行,而且每次生成一个新对象的时候都会调用,不想静态代码块只运行一次

11.事务的使用

配置Spring事务有不少方法,但是这里只说用声明式事务

这里写了一个service的业务层

用xml配置事务,在事务代码上面如果加了一个@transactional,那么会自动回滚....

这就是spring的声明式事务

加了有transactional的事务,会自动的回滚...

12.扩展

事务的事务属性有

    1..事务的传播行为

    2.隔离级别

    3.比如,可以选择性进行回滚

    4.一个事务里面,可以再运行另一个事务,这就叫做事务的传播行为,你可以在前者的事务里继续调用,也可以选择新开一个事务,这个根据具体的业务需求来搞

这里涉及到了一个参数propagation

使用propagation来设置事务的传播行为

  1. 默认:propagation=REQUIRED,表示当一个事务调用另一个事务的时候,默认还是执行原来的事务逻辑,而不是新开一个事务,什么意思呢,遇到一个新事物的时候,不当做开启事务,如果连续遇到2个"事务",第二个事务失败,那么第一个遇到的事故也会连着回滚!!!!!!!

       2.REQUIRED_NEW -->这里就是创建新的事务,事务中的事务,会开启,完成,而外面的大的事务会暂时挂起

事务的隔离级别:

事务到时候实际项目里面,肯定是要并发的,这会产生操作数据库的时候带来的"幻读","脏读"等数据问题,我们现在来看看是如何解决的

@Transactional()里面有一个属性设置,为isolation=Isolation.READ_COMMITED,这里是最常见的,这里的事务隔离级别下次再补充.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值