各个文件放置的位置
业务实现类:被代理类
public class CalFabImpl implements ICalFab {
@Override
public int calFabByLoop(int n) {
int n1 = 1;
int n2 = 1;
int n3 = 0;
for(int i = 3;i<=n;i++){
n3 = n1 + n2;
n1 = n2 ;
n2 = n3;
}
return n3;
}
@Override
public int calFabByRecursion(int n) {
if(n == 1 || n == 2) return 1;
return calFabByRecursion(n-1)+calFabByRecursion(n-2);
}
@Override
public void test() {
System.out.println("12222");
}
}
业务接口:代理接口
public interface ICalFab {
int calFabByLoop(int n);
int calFabByRecursion(int n);
void test();
}
自定义功能性切面,利用XML配置实现
public class SelfAspect {
//--通知:Before类型的Advice
public void testBefore(){
System.out.println("Before do something...");
}
//--通知:After类型的Advice
public void testAfter(){
System.out.println("After do something...");
}
//--通知: Around类型的Adcive ProceedingJoinPoint:连接通知和方法的执行点
public int testAround(ProceedingJoinPoint jp){
int result = 0;
try {
long start = System.currentTimeMillis();
result = (int)jp.proceed(); //--执行真正的业务方法
long end = System.currentTimeMillis();
System.out.println((end-start)+"ms");
} catch (Throwable e) {
e.printStackTrace();
}
return result;
}
}
Invoker类 调用
public class Invoker {
public static void main(String[] args) {
//--1.获取Spring容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");
//--2.获取业务Bean
ICalFab calFab =(ICalFab) ctx.getBean("calFab");
//--3.调用业务方法
System.out.println(calFab.calFabByLoop(40));
System.out.println(calFab.calFabByRecursion(40));
System.out.println(calFab.getClass().getName());
System.out.println(calFab instanceof ICalFab);
//calFab.test();
}
}
XML配置文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- Sprng IOC -->
<bean id="calFab" class="day10_29.AOP.CalFabImpl"></bean>
<bean id="slefAspectRef" class="day10_29.AOP.SelfAspect"></bean>
<!-- 利用Spring的AOP功能配置切面 -->
<aop:config>
<!-- 切面 -->
<aop:aspect ref="slefAspectRef">
<!-- 切点 在CalFabImpl类的任何方法上加通知-->
<aop:pointcut expression="execution(* day10_29.AOP.CalFabImpl.*(..))" id="selfPointcut"/>
<!-- 通知 -->
<aop:before method="testBefore" pointcut-ref="selfPointcut"/>
<aop:after method="testAfter" pointcut-ref="selfPointcut"/>
<aop:around method="testAround" pointcut-ref="selfPointcut"/>
</aop:aspect>
</aop:config>
</beans>
AOP的术语
- 1)Advice 通知
-
用于表示自定义的功能在什么时候执行,具体的通知分类
-
Before:在目标方法执行之前
-
After:在目标方法执行之后
-
After-Returning:在目标方法返回并且执行成功之后之前
-
After-throwing:某个目标方法抛出异常后,就执行该方法
-
Around:在目标方法执行之前或之后执行
- 2)Pointcut 切点
-
表示要在哪个目标方法上执行相应的功能(也就是执行通知)
- 3)Aspect 切面
-
切面的本质就是 。是通知和切点的集合,定义了在哪些方法上什么时候执行什么样的功能