文件放置的位置
业务实现类:被代理类
@Component //Spring IOC
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("test method");
}
}
业务接口:代理接口
public interface ICalFab {
int calFabByLoop(int n);
int calFabByRecursion(int n);
void test();
}
配置类
@Configuration
@EnableAspectJAutoProxy //启用Spring AOP的功能
@ComponentScan("day10_29.annocation")
public class AppConfig {
/*@Bean @Component 这俩个写一个就行
public ICalFab ica(){
return new CalFabImpl();
}*/
}
利用注解自定义切面
@Aspect //指定为切面的标注
@Component
public class SelfAspect {
//1.自定义切点,指定目标方法的位置
@Pointcut("execution(* day10_29.annocation.CalFabImpl.*(..))")
public void selfPointcut(){}
//2.通知:
@Before("selfPointcut()")
public void testBefore(){
System.out.println("Before do something...");
}
@After("selfPointcut()")
public void testAfter(){
System.out.println("After do something...");
}
@Around("selfPointcut()")
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;
}
}
调用者类
public class Invoker {
public static void main(String[] args) {
//1.构造Spring容器
ApplicationContext ctxt = new AnnotationConfigApplicationContext(AppConfig.class);
//2.获取Bean(默认名字的问题)
ICalFab calFab = (ICalFab)ctxt.getBean("calFabImpl");
//3.调用业务方法
//calFab.test();
System.out.println(calFab.calFabByLoop(40));
System.out.println(calFab.calFabByRecursion(40));
//4.验证动态代理
System.out.println(calFab.getClass().getName());
System.out.println(calFab instanceof ICalFab);
//5.容器关闭
((AnnotationConfigApplicationContext)ctxt).close();
}
}