携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
哈喽,大家好!我是Why,一名在读学生,目前刚刚开始进入自己的编程学习生涯。虽然学习起步较晚,但我坚信做了才有0或1的可能。学了一段时间以后也是选择在掘金上分享自己的日常笔记,也希望能够在众多道友的大家庭中打成一片。 本文主要讲解基于接口的静态代理,如果大家读后觉得有用的话,还请大家多多支持博主:欢迎 ❤️点赞👍、收藏⭐、留言💬 ✨✨✨个人主页:JinHuan
基于接口的静态代理
为核心业务(例如add)创建一个接口,通过接口暴露被代理的方法要求:代理类和被代理类都实现了同一个接口
IService
package com.jinhuan.service;
/**
* @Author jinhuan
* @Date 2022/7/3 20:56
* Description:
*/
public interface IService {
void add();
}
BookService
package com.jinhuan.service;
/**
* @Author jinhuan
* @Date 2022/7/3 20:55
* Description: 基于类的静态代理
*/
public class BookService implements IService {
public void add(){
System.out.println("BookService------add()-----");
}
}
事务服务
package com.jinhuan.service.staticProxy;
import com.jinhuan.service.IService;
/**
* @Author jinhuan
* @Date 2022/7/3 20:57
* Description:
* 基于接口的静态代理
* 【代理事务类】
* 代理类和被代理类要去实现同一个接口
*/
public class ProxyTranService implements IService {
//被代理的对象
private IService service;
//可以要求在创建代理类的时候必须把被代理对象加进去
public ProxyTranService(IService service) {
this.service = service;
}
public void add(){
try {
System.out.println("开始事务!");
service.add();//核心功能由被代理对象来完成,其他的服务型业务由代理类来完成
System.out.println("提交事务!");
} catch(Exception e) {
System.out.println("回滚事务!");
}
}
}
日志服务
package com.jinhuan.service.staticProxy;
import com.jinhuan.service.IService;
/**
* @Author jinhuan
* @Date 2022/7/3 21:20
* Description:
*/
public class ProxyLogService {
//被代理的对象
private IService service;
//可以要求在创建代理类的时候必须把被代理对象加进去
public ProxyLogService(IService service) {
this.service = service;
}
public void add(){
try {
System.out.println("开始日志!");
service.add();//核心功能由被代理对象来完成,其他的服务型业务由代理类来完成
System.out.println("结束日志!");
} catch(Exception e) {
System.out.println("异常日志!");
}
}
}
测试类
package com.jinhuan.test;
import com.jinhuan.service.BookService;
import com.jinhuan.service.UserService;
import com.jinhuan.service.staticProxy.ProxyLogService;
import com.jinhuan.service.staticProxy.ProxyTranService;
import org.junit.Test;
/**
* @Author jinhuan
* @Date 2022/7/3 21:01
* Description: 使用基于接口实现的代理类,可以使用一个代理类区代理该接口的所有实现类
*/
public class Test02 {
@Test
public void test(){
BookService bookService = new BookService();
UserService userService = new UserService();
//一个代理类可以代理该接口的所有实现类
//ProxyTranService tranService = new ProxyTranService(bookService);
ProxyTranService tranService = new ProxyTranService(userService);
//tranService.add();
//实现二级代理,即在事务的基础上加上日志,此时的被代理类就是已经代理的一级代理类
//二级代理服务一级代理
ProxyLogService logService = new ProxyLogService(tranService);
logService.add();
}
}
基于切面的AOP接口
提取出切面代码,作为AOP接口。共有4个位置可以将切面代码编织进入核心业务代码中。
Aop接口
package com.jinhuan.aop;
/**
* @Author jinhuan
* @Date 2022/7/3 22:50
* Description:四个切入位置
*/
public interface Aop {
void before();
void after();
void exception();
void myFinally();
}
LogAop
package com.jinhuan.aop;
/**
* @Author jinhuan
* @Date 2022/7/3 22:51
* Description:
*/
public class LogAop implements Aop{
public void before() {
System.out.println("日志----before()--------");
}
public void after() {
System.out.println("日志----after()--------");
}
public void exception() {
System.out.println("日志----exception()--------");
}
public void myFinally() {
System.out.println("日志----myFinally()--------");
}
}
TranAop
package com.jinhuan.aop;
/**
* @Author jinhuan
* @Date 2022/7/3 22:51
* Description:
*/
public class TranAop implements Aop {
public void before() {
System.out.println("事务----before()--------");
}
public void after() {
System.out.println("事务----after()--------");
}
public void exception() {
System.out.println("事务----exception()--------");
}
public void myFinally() {
System.out.println("事务----myFinally()--------");
}
}
AopTestService
package com.jinhuan.service;
/**
* @Author jinhuan
* @Date 2022/7/3 23:05
* Description:
*/
public class AopTestService implements IService{
public void add() {
System.out.println("AopTestService---------add()------");
}
}
TestAop
package com.jinhuan.test;
import com.jinhuan.aop.Aop;
import com.jinhuan.aop.LogAop;
import com.jinhuan.aop.TranAop;
import com.jinhuan.service.AopTestService;
import com.jinhuan.service.IService;
import com.jinhuan.service.staticProxy.ProxyAopService;
import org.junit.Test;
/**
* @Author jinhuan
* @Date 2022/7/3 23:06
* Description:测试切面
*/
public class TestAop {
@Test
public void test(){
//被代理对象
IService aopTestService = new AopTestService();
//两个服务型切面
Aop tranAop = new TranAop();
Aop logAop = new LogAop();
IService tranService = new ProxyAopService(aopTestService, tranAop);
//tranService.add();
IService logService = new ProxyAopService(tranService, logAop);
logService.add();
}
}