Spring框架--AOP学习--利用注解实现

文件放置的位置
在这里插入图片描述

业务实现类:被代理类

@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();
	}
}
发布了26 篇原创文章 · 获赞 9 · 访问量 285

猜你喜欢

转载自blog.csdn.net/weixin_45430616/article/details/102821325