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");
}
}
结果:
通常在方法的执行前后,可以进行一些操作,比如事务的控制。通过自定义注解做到切面编程。
转载于:https://www.cnblogs.com/Joke-Jay/p/8900332.html