需求
用自定义注解,在spring框架中实现事务功能
1.定义一个新的事务注解
2.自己定义一个事务管理器(你需要用到,直接来我这里拿就完了)
3.我这个开发的事务要用在哪,以及加在那个方法上
4.真正的应用这个自己开发的注解
5.利用切面,插入事务这个新的功能
1) 环绕通知:开启事务,然后要是没有问题,提交事务
a.获取目标类上的方法
b.判断这个方法上有没有事务
//如果有事务,调用事务管理器的开启事务和提交
//如果没有,直接调用目标方法
2)异常通知:有问题的负责回滚事务
//有异常,就回滚事务
代码书写
项目准备工作
Ts.java
package com.biem.anno;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//注解
//@Target(ElementType.METHOD)-->方法
@Target(ElementType.METHOD)
//@Retention(RetentionPolicy.RUNTIME)-->
//给JVM看的,在程序运行的过程中做相关的操作。编译器编译后保留,类加载其加载之后保留,
//在JVM运行时通过反射技术反射使用的是什么注解,注解属性值是什么,根据他们两个值做i对应的操作,
@Retention(RetentionPolicy.RUNTIME)
//1.@interface自定义注解
//<1>@interface自定义注解自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。
//<2>在定义注解时,不能继承其他的注解或接口。
//<3>使用@interface来声明一个注解
//作用在方法上注解
public @interface Ts {
}
TsManaget.java
package com.biem.utils;
public class tsManager {
public static void startTX() {
System.out.println("开启事务");
}
public static void commitedTX() {
System.out.println("提交事务");
}
public static void rollbackTX() {
System.out.println("回滚事务");
}
}
TsAspect.java
package com.biem.aspect;
import java.lang.reflect.Method;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.reflect.MethodSignature;
import com.biem.anno.Ts;
import com.biem.utils.tsManager;
//切面
public class TsAspect {
@Around("execution (* com.biem.service.*.*(..))")
public void around(ProceedingJoinPoint jp) throws Throwable{
MethodSignature signature = (MethodSignature) jp.getSignature();
Method method = signature.getMethod();
Class<?> clz = jp.getTarget().getClass();
//判断类上是否有TypeAnnotation注解
Method realmethod = clz.getMethod(method.getName(), method.getParameterTypes());
if (realmethod.isAnnotationPresent(Ts.class)) {
tsManager.startTX();
jp.proceed();
tsManager.commitedTX();
}else {
jp.proceed();
}
}
}
UserService.java
package com.biem.service;
//增删改查
public interface UserService {
public String addUser(String name);
public void updateUser();
public void deleteUser();
public void query();
}
UserServiceImpl.java
package com.biem.service;
import org.springframework.stereotype.Service;
@Service("userService")
public class UserServiceImpl implements UserService {
@Override
public String addUser(String name) {
System.out.println("添加用户。。");
return null;
}
@Override
public void updateUser() {
System.out.println("更新用户。。");
}
@Override
public void deleteUser() {
System.out.println("删除用户。。");
}
@Override
public void query() {
System.out.println("查询用户。。");
}
}
Tstest.java
package com.biem.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.biem.service.UserService;
public class TStest {
@Test
public void test01() {
//获取 路径
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
//使用 getbean方法从容器中获取对象
UserService userService = (UserService) context.getBean("userService");
//定义接受类型并接受其方法
String result = userService.addUser("尤子介");
userService.updateUser();
userService.deleteUser();
userService.query();
System.out.println(result);
}
}
运行结果
添加用户。。
更新用户。。
删除用户。。
查询用户。。
null