Spring的总结
1.spring是什么
spring是一个在JAVAEE的领域中,轻量级的,开源的AOP和IOC的框架
2.spring能干什么
spring可以让我们在开发中降低项目的复杂度,降低开发的难度和周期,可以粘合大量的第三方工具,降低各自的耦合度,提升了我们的开发效率。
3.spring的优点
- 高内聚,低耦合
- 声明式事务管理的支持
- AOP的支持
- 方便集成各种优秀框架
- 降低了JAVA EE 的API 的使用难度
- 方便程序的测试
4.IOC是什么
IOC就是Inversion of Control控制反转,是一种设计的概念。简单来说就是把开发者创建对象的这个权利交给了容器本身,这个权利的互换就叫做控制反转
而说到了IOC,就不得不说DI了,DI就是依赖注入。通过控制反转,我们创建对象已经交由容器本身来处理了,那么容器创建的bean中的属性注入和引用,就叫做依赖注入。
5.AOP是什么
AOP就是aspect of programming ,直译的话就是面向切面编程。是通过预编译或者运行期间,利用动态代理技术实现了程序的功能统一添加和管理。
AOP可以实现的功能大概有如下
- 日志管理
- 事务管理
- 监控统计
- 安全控制
- 异常处理
AOP实际上也就是使用了动态代理的技术,而我们实现动态代理的方式有哪些?
-
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 } }
-
cglib(需要导入包)的技术
这个就不再演示(我也不会啊),在spring中大量使用到了这个技术,因为这种代理方式不需要用到接口
6.AOP的核心概念
-
pointcut(切入点)
pointcut指的是将要执行advice的方法
-
aspect(切面)
包含了pointcut的定义和advice的定义
-
Joinpoint(连接点)
所有可以被通知的方法
-
advice(通知)
通知也可以理解为增强,就是在切入点方法执行的前后或者过程中,执行一些特定的代码
通知的类型有如下几种:
- 前置通知(before)
- 环绕通知(around)
- 后置通知(after-returnning)
- 异常通知(after-throwing)
- 最终通知(after)
- 引介通知(DeclareParents)少用
-
weaving(织入)
织入是指目标方法被通知增强的过程
-
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>