目錄
列:spring 註解版計算器
計算器接口Calc.java
/**
* 計算器
* @author 51361
*
*/
public interface Calc {
public int add(int x,int y);
public int div(int x,int y);
public void mul(int x,int y);//乘
}
接口實現
/**
* 接口實現類
* @author 51361
*
*/
/*
* @Component(value="calc") :實例化對象 calc爲對象名
*/
@Component(value="calc")
public class CalcImpl implements Calc {
public int add(int x, int y) {
// TODO Auto-generated method stub
System.out.println("add");
return x+y;
}
public int div(int x, int y) {
// TODO Auto-generated method stub
System.out.println("div");
return x/y;
}
public void mul(int x, int y) {
// TODO Auto-generated method stub
System.out.println("mul===="+(x*y));
}
}
切面MyAspect
@Aspect
@Component(value="calcProxy")
public class MyAspect {
//@Before(value="addMethod()") :切入點
@Before(value="addMethod()")
public void check(){
System.out.println("切面---檢查權限 ---前置通知");
}
// @After(value="addMethod()") 後置通知
@After(value="addMethod()")
public void check1(){
System.out.println("寫入日誌---後置通知");
}
/*
* @AfterReturning(value="addMethod()",returning="reValue")
* @AfterReturning 後置通知
* returning="reValue返回值
*/
@AfterReturning(value="addMethod()",returning="reValue")
public void check3(Object reValue){
System.out.println("後置通知--返回值:"+reValue);
}
@AfterThrowing(value="addMethod()",throwing="ex")//異常通知
public void writeLog(Exception ex){
System.out.println("異常通知־"+ex.getMessage());
}
@Around(value="addMethod()")
public Object check(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("--環繞通知前--");
Object obj=pjp.proceed(); //執行目標方法
System.out.println("--環繞通知處理結果ojb::"+obj);
System.out.println("--環繞通知後");
return obj;//返回目標方法
}
// @Pointcut("execution(* com.iotek.CalcImpl.*(..))") 切面表達式
@Pointcut("execution(* com.iotek.CalcImpl.*(..))")
public void addMethod(){}
}
bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 1 添加註解命名空間 xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd -->
<!-- 2 掃描指定包下所有組件 -->
<context:component-scan base-package="com.iotek"></context:component-scan>
<!--3 開啓aop動態代理 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
測試
public class SpringTest {
@Test
public void test1(){
ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
Calc calc=(Calc)context.getBean("calc");
calc.mul(10, 20);
}
@Test
public void test2(){
ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
Calc calc=(Calc)context.getBean("calc");
int rs=calc.add(20, 30);
System.out.println("rs=="+rs);
}
/**
* 測試異常通知
*/
@Test
public void test3(){
ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
Calc calc=(Calc)context.getBean("calc");
calc.div(10, 0);
}
/**
* 環繞通知
*/
@Test
public void test4(){
ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
Calc calc=(Calc)context.getBean("calc");
int rs= calc.add(10, 29);
System.out.println("rs==="+rs);
}
}
結果: