Spring AOP Advices - Around advice example - xml based configuration

In Spring, aspect-oriented programming (AOP) is a programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns. AOP forms a basis for aspect-oriented software development.

In this page you will see an example for Spring AOP - Around advice. It combines all three advices (before advice, after returning advice and around advice) during method execution.

pom.xml file gives all required dependencies:

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>SpringJavaBasedConfig</groupId>
    <artifactId>SpringJavaBasedConfig</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <properties>
        <spring.version>3.2.0.RELEASE</spring.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.1</version>
        </dependency>
    </dependencies>
</project>

My business logic service class:

package com.java2novice.bean;

public class MyBusinessService {

    public void runMyBusinessLogic(){
        System.out.println("************************************");
        System.out.println("Running business logic...");
        System.out.println("************************************");
    }

    public void testThrowException() {
        throw new NullPointerException();
    }
}

Now create “Around Advice”. Create a class which implements MethodInterceptor interface. You must call Object result = metInvocation.proceed() method to proceed on the original method execution, else the original method will not execute.

package com.java2novice.aop;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class ExecuteAroundMethod implements MethodInterceptor{

    @Override
    public Object invoke(MethodInvocation metInvocation) throws Throwable {

        System.out.println("Inside RunBeforeExecution.before() method...");
        System.out.println("Running before advice...");
        try{
            Object result = metInvocation.proceed();

            System.out.println("Inside RunAfterExecution.afterReturning() method...");
            System.out.println("Running after advice...");

            return result;
        } catch(NullPointerException ne){
            //this is for ThrowsAdvice
            throw ne;
        }

    }

}

Here is the xml based configuration file. Add bean entry for ExecuteAroundMethod class (around advice class). Also create a proxy for MyBusinessService class. In this proxy configuration, you should add two properties called ‘target’ and ‘interceptorNames‘. ‘target’ defines in which bean you want to introduce advice. ‘interceptorNames’ defines that which advice class you want to introduce to the said target.

<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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <bean id="busService" class="com.java2novice.bean.MyBusinessService" />
    <bean id="aroundThrow" class="com.java2novice.aop.ExecuteAroundMethod" />
    <bean id="busServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean" >
        <property name="target" ref="busService" />
        <property name="interceptorNames">
            <list>
                <value>aroundThrow</value>
            </list>
        </property>
    </bean>
</beans>

Here is the final demo class: Note that we are calling proxy bean object, not the business service bean directly.

package com.java2novice.test;

import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.java2novice.bean.MyBusinessService;

public class SpringDemo {

    public static void main(String a[]){

        String confFile = "applicationContext.xml";
        ConfigurableApplicationContext context 
                                = new ClassPathXmlApplicationContext(confFile);
        MyBusinessService busServ = (MyBusinessService) context.getBean("busServiceProxy");
        busServ.runMyBusinessLogic();
    }
}

Output:

Inside RunBeforeExecution.before() method...
Running before advice...
************************************
Running business logic...
************************************
Inside RunAfterExecution.afterReturning() method...
Running after advice...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值