1.新建一个目标类
接口:public interface IUserService
//切面编程
public void addUser();
public void updateUser( );
public void deleteUser( );
}
实现类:
@Service
public class UserServiceImpl implements IUserService {
@Override
public void addUser() {
}
@Override
public void updateUser() {
}
@Override
public void deleteUser() {
System.out.println("删除用户");
}
}
切面类: 增强代码与切入点结合
public class MyAspect {
public void before(){
System.out.println("开启事务");
}
public void after(){
System.out.println("提交事务");
}
}
2.新建一个工厂类
public class MyBeanFactory {
/**
* JDk实现的代理
* @return
*/
public static IUserService createUserService(){
//1创建对象
final IUserService userService= new IUserviceImpl();
System.out.println(userService);
//2声明切面类对象
final MyAspect aspect=new MyAspect();
//3把切面类2个方法 应用 到目标类
//3.1创建jdk代理
/* newProxyInstance(
ClassLoader loader, //类加载器
Class<?>[] interfaces, 接口
InvocationHandler h) 处理
*/
IUserService proxyService = (IUserService) Proxy.newProxyInstance(
MyBeanFactory.class.getClassLoader(),
userService.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//开启事务
aspect.before();
//方法返回值是 业务方法的返回值
Object retObj = method.invoke(userService, args);
System.out.println("拦截的返回值" + retObj);
//提交事务
aspect.after();
return retObj;
}
}
);
//返回代理
return proxyService;
}
创建测试类
执行结果:可以看出手写的拦截器经jdk代理 增强成功
通过debug运行可以发现对象由代理创建:
new一个对象后再次运行 仅仅为一个实现类对象