sprig中我们在service层进行事务控制的时候,通常使用注解的方式进行,在service类上标注@transaction,下面我们就简单分析一下它是如何实现的,顺便复习一下反射的知识
首先创建一个自定义注解类:
package org.anno; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; //@Target(ElementType.METHOD)//该注解表示:使用HelloWord注解时 是放在方法上的 如果不写 表示可以放在任何地方 //注解的存活时间 @Retention(RetentionPolicy.RUNTIME) public @interface HelloWord { public String value() default "hello";//成员 既不是属性 也不是方法 hello是设置的缺省值 }
测试的实体Bean 在其中一个方法上使用自定义的注解
package org.anno; //@HelloWord public class TestBean { //@HelloWord("张三") //修改缺省值为张三 private String name; public TestBean() {} public TestBean(String name) {this.name=name;} @HelloWord public void x() { System.out.println(this.name); } }
反射类:
package org.anno; import java.lang.reflect.Method; public class Parse { public void parse(Object object,String methodName) { Method[] methods = object.getClass().getMethods();//得到传递对象中的所有方法 //判断 如果有对应的注解 就进行特定的操作 for(Method m:methods) { if(m.getName().equals(methodName)) {//传递的字段和遍历的字段相等 进入 if(m.isAnnotationPresent(HelloWord.class)){//判断该方法的声明上是否有HelloWord类修饰过 //如果有的话,我们可以拿到该anno HelloWord hw=m.getAnnotation(HelloWord.class); //打印该anno中的值 //System.out.println(hw.value()); try { System.out.println(hw.value()+"调用指定方法之前做。。。操作");//执行方法前做。。。 事务的控制 m.invoke(object,null);//调用对象中的指定方法 System.out.println(hw.value()+"调用指定方法之后做。。。操作");//执行方法之后做。。。。 } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } } } } }
测试:
package org.anno; import org.junit.Test; public class MainTest { public static void main(String[] args) { // TODO Auto-generated method stub TestBean testBean=new TestBean("abc"); //要求:创建对象 输出对象中的x()方法 //实现1:直接调用 testBean.x(); System.out.println("--------------------------"); //实现2:通过反射技术 调用 在调用之前和之后 可以进行一些处理 Parse p=new Parse();// p.parse(testBean,"x"); } }
结果:
通常在方法的执行前后,可以进行一些操作,比如事务的控制。通过自定义注解做到切面编程。