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来设置事务的传播行为
-
默认:propagation=REQUIRED,表示当一个事务调用另一个事务的时候,默认还是执行原来的事务逻辑,而不是新开一个事务,什么意思呢,遇到一个新事物的时候,不当做开启事务,如果连续遇到2个"事务",第二个事务失败,那么第一个遇到的事故也会连着回滚!!!!!!!
2.REQUIRED_NEW -->这里就是创建新的事务,事务中的事务,会开启,完成,而外面的大的事务会暂时挂起
事务的隔离级别:
事务到时候实际项目里面,肯定是要并发的,这会产生操作数据库的时候带来的"幻读","脏读"等数据问题,我们现在来看看是如何解决的
@Transactional()里面有一个属性设置,为isolation=Isolation.READ_COMMITED,这里是最常见的,这里的事务隔离级别下次再补充.