动态代理
jdk动态代理(必须有接口)
public Object getProxy() {
ClassLoader classLoader = this.getClass().getClassLoader();
Class[] interfaces = mathImpl.getClass().getInterfaces();
return Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("前");
Object result = method.invoke(mathImpl, args);
System.out.println("后");
return result;
}
});
}
public static void main(String[] args) {
ProxyUtil proxyUtil = new ProxyUtil(new MathImpl);
MathI math = (MathI)proxyUtil.getProxy();
int i = math.add(1,1);
System.out.println(i);
}
AOP概述
AOP(Aspect-Oriented Programming,面向切面编程):是一种新的方法论,是对传统OOP(object-Oriented Programming,面向对象编程)的补充。
面向对象:纵向继承机制
面向切面:横向抽取机制
@Transactional中可以设置的属性
propagation(事务的传播级别):A方法和B方法都有事务,当A在调用B时,会将A中的事务传播给B方法,B方法对于事务的处理方式就是事务的传播行为
Propagation.REQUIRED:必须使用调用这的事务
Propagation.REQUIRES_NEW:不使用调用者的事务,使用新的事务进行处理
isolation(事务的隔离级别):在并发的情况下,操作数据的一种规定
读未提交:脏读 1(2的0次方)
读已提交:不可重复读 2 (2的1次方)
可重复读:幻读 4 (2的2次方)
可串行化:性能低、消耗大 8(2的3次方)
timeout:在事务强制回滚前最多可以执行(等待)的时间
readOnly:指定当前事务中的一系列的操作是否为只读,默认为false
若设置为只读,不管事务中有没有写的操作,mysql就会在请求方位数据的时候,不加锁,提高性能
但是如果有些操作的情况,建议一定不能设置只读
rollbackFor|rollbackForClassName|noRollbackFor|noRollbackForClassName:设置事务的回滚条件