sprig中咱們在service層進行事務控制的時候,一般使用註解的方式進行,在service類上標註@transaction,下面咱們就簡單分析一下它是如何實現的,順便複習一下反射的知識java
首先建立一個自定義註解類:編程
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); } }
反射類:this
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(); } } } } } }
測試:spa
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"); } }
結果:code
一般在方法的執行先後,能夠進行一些操做,好比事務的控制。經過自定義註解作到切面編程。對象