AOP
Aspect Oriented Programming,是一种编程思想,是面向对象编程OOP的补充,很多框架都实现了对AOP编程思想的实现;
AOP就是将交叉业务逻辑封装成切面,利用AOP容器的功能将切面织入到主业务逻辑中。交叉业务逻辑指的是通用的、与主业务逻辑无关的代码。如安全检查、事务、日志等。
首先定义一个主业务接口 IsomeService ,定义了两个目标方法doSome()和doOther()
public interface IsomeService {
//目标方法
public void doSome();
public String doOther();
}
**定义一个目标类SomeServiceImpl,对接口进行实现**
public class SomeServiceImpl implements IsomeService {
@Override
public void doSome() {
System.out.println("-----doSome方法执行!------");
}
@Override
public String doOther() {
System.out.println("-----doOther方法执行!------");
return null;
}
}
定义一个工具类MyUtil,里面对开启事物以及日志输出做了封装
public class MyUtil {
public static void doTra(){
System.out.println("-----开启事物------");
}
public static void doLog(){
System.out.println("-----返回日志------");
}
}
动态代理增强
public class TestAop {
//动态代理增强
@Test
public void testService(){
IsomeService someService=new SomeServiceImpl();
IsomeService proxy=(IsomeService) Proxy.newProxyInstance(someService.getClass().getClassLoader(), someService.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object **invoke**(Object proxy, Method method, Object[] args) throws Throwable {
MyUtil.doTra();
Object result = method.invoke(someService, args);
MyUtil.doLog();
return result;
}
});
proxy.doSome();
String str=proxy.doOther();
System.out.println(str);
}
}
AOP基本术语介绍
- 切面:泛指交叉业务逻辑。常用的切面有通知与顾问,切面就是对主业务逻辑的一种增强。例如上面的工具类MyUtil
- 织入:指将切面代码插入到目标对象的过程。动态代理中invoke()方法完成的工作就是织入
- 连接点:指切面可以织入的位置,主业务接口中的doSome()和doOther()均为连接点
- 切入点:指切面具体织入的位置,在目标实现类中,若doSome()将被增强,而doOther()不被增强,则doSome()为切入点,而 doOther()仅为连接点。
- 通知:是切面的一种实现,可以完成简单织入功能。通知定义了增强代码切入到目标代码的时间点,是目标方法执行之前执行,还是之后执行等。通知类型不同,切入时间不同。
- 顾问:是切面的一种实现,能够将通知以更为复杂的方式织入到目标对象中,是将通知包装为更复杂切面的装配器。不仅指定了切入时间点,还可以指定具体的切入点。