Spring AOP Three Way

[b]Target Class:[/b]
public class Hello {

public void greeting() {
System.out.println("reader");
}
}

public class ExceptionTarget {

public void errorMethod() throws Exception {
throw new Exception("Fake exception");
}

public void otherErrorMethod() throws NullPointerException {
throw new NullPointerException("Other Fake exception");
}

}


[b]1:Programmatic way:[/b]
[b]Before advice[/b]

public class BeforeAdvice implements MethodBeforeAdvice {

public static void main(String[] args) {
// target class
Hello target = new Hello();

// create the proxy
ProxyFactory pf = new ProxyFactory();

// add advice
pf.addAdvice(new BeforeAdvice());

// setTarget
pf.setTarget(target);

Hello proxy = (Hello) pf.getProxy();
proxy.greeting();
}

public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println("Good morning");
}
}


[b]After returning advice[/b]

public class AfterRetuningAdvice implements AfterReturningAdvice {

public static void main(String[] args) {
// target class
Hello target = new Hello();

// create the proxy
ProxyFactory pf = new ProxyFactory();

// add advice
pf.addAdvice(new AfterRetuningAdvice());

// setTarget
pf.setTarget(target);

Hello proxy = (Hello) pf.getProxy();
proxy.greeting();
}

public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {

System.out.println(",this is a afterReturningAdvice message");
}
}


[b]Around advice[/b]

public class MethodDecorator implements MethodInterceptor {

public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.print("Hello ");
Object retVal = invocation.proceed();
System.out.println("this is aop !");
return retVal;
}
}

public class AroundAdvice {

public static void main(String[] args) {

// target class
Hello target = new Hello();

// create the proxy
ProxyFactory pf = new ProxyFactory();

// add advice
pf.addAdvice(new MethodDecorator());

// setTarget
pf.setTarget(target);

Hello proxy = (Hello) pf.getProxy();
proxy.greeting();
}
}


[b]After throwing advice[/b]

public class ThrowsAdviceClass implements ThrowsAdvice {

public static void main(String[] args) {

// target class
ExceptionTarget errorBean = new ExceptionTarget();

// create the proxy
ProxyFactory pf = new ProxyFactory();

// add advice
pf.addAdvice(new ThrowsAdviceClass());

// setTarget
pf.setTarget(errorBean);

ExceptionTarget proxy = (ExceptionTarget) pf.getProxy();

try {
proxy.errorMethod();
} catch (Exception ignored) {

}

try {
proxy.otherErrorMethod();
} catch (Exception ignored) {

}
}

public void afterThrowing(Exception ex) throws Throwable {
System.out.println("+++");
System.out.println("Exception Capture:" + ex.getClass().getName());
System.out.println("+++\n");
}

public void afterThrowing(Method method, Object[] args, Object target, NullPointerException ex) throws Throwable {
System.out.println("+++");
System.out.println("NullPointerException Capture: " + ex.getClass().getName());
System.out.println("Method: " + method.getName());
System.out.println("+++\n");
}

}



[b]2:AspectJ annotations:[/b]
[b]Before advice[/b]

@Aspect
public class BeforeAspect {

@Before("execution(* greeting(..))")
public void beforeGreeting() {

System.out.println("Good morning ");
}
}

<aop:aspectj-autoproxy/>
<bean id="hello" class="org.springaop.target.Hello" p:label="writer"/>
<bean id="before" class="org.springaop.chapter.one.annotation.before.BeforeAspect"/>


[b]After returning advice:[/b]方法正常执行退出,才会被advice

@Aspect
public class AfterReturningAspect {

@AfterReturning("execution(* greeting(..))")
public void afterGreeting() {

System.out.println("this is a aop !");
}
}

<aop:aspectj-autoproxy/>
<bean id="hello" class="org.springaop.target.Hello" p:label="writer"/>
<bean id="afterReturning" class="org.springaop.chapter.one.annotation.after.returning.AfterReturningAspect"/>


[b]Around advice[/b]

@Aspect
public class AroundAspect {

@Around("execution(* greeting(..))")
public Object aroundGreeting(ProceedingJoinPoint pjp) throws Throwable {

System.out.print("Hello ");
try {

return pjp.proceed();
} finally {
System.out.println("this is around aop !");
}

}
}

<aop:aspectj-autoproxy/>
<bean id="hello" class="org.springaop.target.Hello" p:label="writer"/>
<bean id="around" class="org.springaop.chapter.one.annotation.around.AroundAspect"/>


[b]After (finally) advice[/b]方法执行完毕,包括因异常导致退出,也会被advice

@Aspect
public class AfterFinallyAspect {

@After("execution(* greeting(..))")
public void afterGreeting() {

System.out.println("this is afterAspect !");
}
}

<aop:aspectj-autoproxy/>
<bean id="hello" class="org.springaop.target.Hello" p:label="writer"/>
<bean id="afterFinally" class="org.springaop.chapter.one.annotation.afterfinally.AfterFinallyAspect"/>


[b]After throwing advice[/b]

@Aspect
public class AfterThrowingAspect {

@AfterThrowing("execution(* errorMethod(..))")
public void afterGreeting() {

System.out.println("+++");
System.out.println("Exception !");
System.out.println("+++\n");
}

}

<aop:aspectj-autoproxy/>
<bean id="exceptionTarget" class="org.springaop.target.ExceptionTarget"/>
<bean id="throws" class="org.springaop.chapter.one.annotation.throwsadvice.AfterThrowingAspect"/>



[b]3:Schema-based configuration:[/b]
[b]Before advice[/b]

public class SpringAopAspectBeforeExample {
public void beforeGreeting() {

System.out.println("Good morning ");
}
}

<aop:config>
<aop:aspect ref="before">
<aop:before method="beforeGreeting" pointcut="execution(* greeting(..))" />
</aop:aspect>
</aop:config>
<bean id="hello" class="org.springaop.target.Hello" p:label="writer" />
<bean id="before" class="org.springaop.aspects.schema.SpringAopAspectBeforeExample" />


[b]After returning advice[/b]

public class SpringAopAspectAfterReturningExample {

public void afterGreeting() {

System.out.println("this is a aop !");
}
}

<bean id="hello" class="org.springaop.target.Hello" p:label="writer"/>
<aop:config>
<aop:aspect ref="afterReturning">
<aop:after-returning method="afterGreeting" pointcut="execution(* greeting(..))" />
</aop:aspect>
</aop:config>
<bean id="afterReturning" class="org.springaop.aspects.schema.SpringAopAspectAfterReturningExample"/>


[b]Around advice[/b]

public class SpringAopExampleAroundExample {

public Object aroundGreeting(ProceedingJoinPoint pjp) throws Throwable {

System.out.print("Hello ");
try {
return pjp.proceed();
} finally {
System.out.println("this is around aop !");
}
}
}

<bean id="hello" class="org.springaop.target.Hello" p:label="writer" />
<aop:config>
<aop:aspect ref="around">
<aop:around method="aroundGreeting" pointcut="execution(* greeting(..))" />
</aop:aspect>
</aop:config>
<bean id="around" class="org.springaop.aspects.schema.SpringAopExampleAroundExample" />


[b]After (finally) advice[/b]

public class SpringAopAspectAfterExample {

public void afterGreeting() {

System.out.println("this is afterAspect !");
}
}

<bean id="hello" class="org.springaop.target.Hello" p:label="writer" />

<aop:config>
<aop:aspect ref="after">
<aop:after method="afterGreeting" pointcut="execution(* greeting(..))" />
</aop:aspect>
</aop:config>

<bean id="after" class="org.springaop.aspects.schema.SpringAopAspectAfterExample" />


[b]After throwing advice[/b]

public class SpringAopAspectAfterThrowingExample {

public void afterErrorMethod() {

System.out.println("+++");
System.out.println("Exception !");
System.out.println("+++\n");
}

}

<bean id="exceptionTarget" class="org.springaop.chapter.one.schema.throwsadvice.ExceptionTarget" />
<aop:config>
<aop:aspect ref="afterThrowing">
<aop:after-throwing method="afterErrorMethod"
pointcut="execution(* errorMethod(..)) throws Exception" />
</aop:aspect>
</aop:config>
<bean id="afterThrowing" class="org.springaop.aspects.schema.SpringAopAspectAfterThrowingExample" />
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值