事务与代理

好吧写了好久的没点保存全都丢了。现在重写。倒是想起来三月份时候帮别人修改wps了啊哈哈

Mysql事务
事务:事务值逻辑上的一组操作。组成这个操作的各个单元,要么全成功,要么全不成功。

手动控制事务
开启事务:start transaction begin
提交事务:commit
回滚事务:rollback

事务的特性(面试题)
原子性:事务是不可分割的,要么全发生,要么全不发生。
一致性:事务必须使得数据库从一个一致状态转到另一个一致状态(有点像能量守恒)
隔离性:一个事务是一个
持久性:发生即存在,即使数据库崩了

事务的隔离级别
赃读:指一个事务读了另一个事务(还没提交完就显示了)
不可重复读:读的时候这边改了(update)
幻读:读的时候增加了(insert)

数据库通过设置事务的隔离级别防止以上情况的发生:
* 1、READ UNCOMMITTED: 赃读、不可重复读、虚读都有可能发生。
* 2、READ COMMITTED: 避免赃读。不可重复读、虚读都有可能发生。(oracle默认的)
* 4、REPEATABLE READ:避免赃读、不可重复读。虚读有可能发生。(mysql默认)
* 8、SERIALIZABLE: 避免赃读、不可重复读、虚读。
级别越高,性能越低,数据越安全

好了开启下一节:代理模式,23种常用的面向对象软件的设计模式之一

Proxy patten
优点:(1)职责清晰
(2)保护作用
(3)高扩展性








Proxy.newProxyInstance():产生代理类的实例。仅能代理实现至少一个接口的类
ClassLoader:类加载器。固定写法,和被代理类使用相同的类加载器即可。
Class[] interface:代理类要实现的接口。固定写法,和被代理类使用相同的接口即可。
InvocationHandler:策略(方案)设计模式的应用。如何代理?

InvocationHandler中的invoke方法:调用代理类的任何方法,此方法都会执行
  Object proxy:代理对象本身的引用。一般用不着。
  Method method:当前调用的方法。
  Object[] args:当前方法用到的参数


Ok,下一个是代理模式的实例

Class Wangwu
{
Public static void main (String [] args)
{
//创建被代理的对象
Final meinv lmm = new LMM();
//创建代理对象,动态代理,直接生成代理对象
Meinv mp  = (meinv) Proxy.newProxyInstance(lmm.getClass.getLoader() , lmm.getClass().getInterfaces() , new InvocationHandler(){
//proxy参数接受的是代理对象,method接收的是被调用的方法,args是参数
@Override
Public Object invoke(Object proxy,Method method,Object []args) throws Throwable{
System.out.println(“媒婆拿走了500”);
Object obj = method.invoke(lmm,new Object[]{(Double) args[0]/2});
System.out.println(“媒婆偷着乐”);
Return obj;
}
}
);
Mp.shopping(1000);
Mp.eat(1000);
}
}

这个框是弱智吧愁死我了

开启下一个环节:注解

1
他不是注释,他是给程序看的,用来描述程序是如何运行及在什么阶段运行的
注解在实际开发中,最大的功能是用来替换配置文件。
注解是 jdk1.5的新特性
可以通过反射来让注解具有功能


2
(1)jdk中的三个基本注解
@Override 检查子类确实覆盖了父类的方法
@Deprecated 说明已经过时了
@SupperssWarnings({“unused”,”deprecation”}):控制程序中的警告。{} 数组。 All抑制所有警告

(2)自定义注解的语法

//注解实际是一个接口,只需要在interface前加入@符号,就是一个注解了
//本质上就是一个接口,继承了java.lang.annotation.Annotation接口
public @interface MyAnnotation1 {

//在注解中可以定义属性
//int age() default 23;//没有指定默认值,在使用该注解时必须指定属性的值
String name();
String value() default "hehe";//该属性比较特殊,在使用注解时可以不指定属性名称
Hobby hobby();//枚举类型
Class claz();
String[] like();
// public static final int num = 23;//没出错
// public abstract void ss();//出错
}
public class Demo2 {

//使用自定义的注解
//@MyAnnotation1(age=20,name="李四")
@MyAnnotation1(name="yy",value="kk",hobby=Hobby.play,claz=Object.class,like={"hehe","haha"})
public void ff()
{

}

}

(3)注解的反射:(重要)
A:反射注解类
哦就是像发射,把注解拿出来
<T extends Annotation> T getAnnotation(Class<T> annotationType):得到指定类型的注解引用。没有返回null。
Annotation[] getAnnotations():得到所有的注解,包含从父类继承下来的。
Annotation[] getDeclaredAnnotations():得到自己身上的注解。
boolean isAnnotationPresent(Class<? extends Annotation> annotationType):判断指定的注解有没有。

Class、Method、Field、Constructor等实现了AnnotatedElement接口.
如果:Class.isAnnotationPresent(MyTest.class):判断类上面有没有@MyTest注解;
Method.isAnnotationPresent(MyTest.class):判断方法上面有没有@MyTest注解。


(4)元注解
a、自定义的注解的存活范围(生命周期):默认是CLASS。

什么是元注解:
只能用在注解上的注解叫做元注解。(即:用于修饰注解的注解)
@Retention:作用。改变自定义的注解的存活范围。
RetentionPolicy:
SOURCE
CLASS
RUNTIME
@Target:作用,指定该注解能用在什么地方。
ElementType:
TYPE:
METHOD:
FIELD:
ANNOTATION_TYPE
@Documented:作用,使用了@MyTest的注解的类,如果@MyTest注解上面有@Documented注解,那么使用了@MyTest的注解的类的API文档中会出现@MyTest的身影。
@Inherited:作用,说明该注解可以被继承下去。

类加载器:这东西还挺好玩
作用就是把class文件加载到jvm中,class引用字节码
Jvm中的类加载器:
BootStrap:老大。类加载器的祖先。 打印它会得到null。
负责加载JRE/lib/rt.jar(JDK中绝大部分的类)
ExtClassLoader:
负责加载JRE/lib/ext/*.jar
AppClassLoader:
负责加载在classpath环境变量中的所有类。

父类委托机制
引用


先说大方面
就是加载jar包里的类,三个加载器分别负责加载不同的
想一想老师上课用的那个例子:
两个类,一个子类,一个父类,子类继承父类
A extends HttpServlet
把A 放第二个jar里找,
先从第一个找,再从第二个找,第二圈
找到了A ,加载A ,然后加载父类,
从第二个找,往上找,
父类只会往上找,不会往下找
先加载A ,后加载父类

猜你喜欢

转载自zhanghecheng.iteye.com/blog/2339482