1. 程式人生 > >Spring 註解方式配置aop:

Spring 註解方式配置aop:

註解配置AOP(使用 AspectJ 類庫實現的),大致分為三步:

1. 使用註解@Aspect來定義一個切面,在切面中定義切入點(@Pointcut),通知型別(@Before, @AfterReturning,@After,@AfterThrowing,@Around).

2. 開發需要被攔截的類。

3. 將切面配置到xml中,當然,我們也可以使用自動掃描Bean的方式。這樣的話,那就交由Spring AoP容器管理。

另外需要引用 aspectJ 的 jar 包: aspectjweaver.jar aspectjrt.jar

1  實體類:

public class User {

    private String username;

    private String password;

    public String getUsername() {

        return username;

    }

    public void setUsername(String username) {

        this.username = username;

    }

    public String getPassword() {

        return password;

    }

    public void setPassword(String password) {

        this.password = password;

    }

}

2  dao 介面類:

package com.bjsxt.dao;

import com.bjsxt.model.User;

public interface UserDAO {

    public void save(User user);

}


3 dao 實現類

@Component("u")

public class UserDAOImpl implements UserDAO {

    public void save(User user) {

        System.out.println("user save11d!");

        /*throw new RuntimeException("exception");*/ //拋異常

    }

}


4 service 服務類

@Component("userService")

public class UserService {

    private UserDAO userDAO;  

    public void init() {

        System.out.println("init");

    }

    public void add(User user) {

        userDAO.save(user);

    }

    public UserDAO getUserDAO() {

        return userDAO;

    }

    @Resource(name="u")

    public void setUserDAO( UserDAO userDAO) {

        this.userDAO = userDAO;

    }

    public void destroy() {

        System.out.println("destroy");

    }

}

現在要對service 進行 aop 操作。

5 切面類:

@Aspect

@Component

public class LogInterceptor {

    @Pointcut("execution(public * com.bjsxt.service..*.add(..))")

    public void myMethod(){};

    @Before("myMethod()")

    public void before() {

        System.out.println("method staet");

    } 

    @After("myMethod()")

    public void after() {

        System.out.println("method after");

    } 

    @AfterReturning("execution(public * com.bjsxt.dao..*.*(..))")

    public void AfterReturning() {

        System.out.println("method AfterReturning");

    } 

    @AfterThrowing("execution(public * com.bjsxt.dao..*.*(..))")

    public void AfterThrowing() {

        System.out.println("method AfterThrowing");

    } 

}

解釋類:

1 : 定義一個 切點,名字是myMethod.

@Pointcut("execution(public * com.bjsxt.service..*.add(..))")

    public void myMethod(){};

對應xml 配置: <aop:pointcut id="myMethod"  expression="execution(public * com.bjsxt.service..*.add(..))" />  

2 在myMethod切點執行之後,呼叫after 方法。

    @After("myMethod()")

    public void after() {

        System.out.println("method after");

    } 

對應XML 配置:

<aop:after pointcut-ref="myMethod" method="after"/> 

3  在切點 execution(public * com.bjsxt.dao..*.*(..))  返回後,執行AfterReturning 方法。

    @AfterReturning("execution(public * com.bjsxt.dao..*.*(..))")

    public void AfterReturning() {

        System.out.println("method AfterReturning");

    } 

對應 XML :

<aop:after-returning pointcut="execution(public * com.bjsxt.dao..*.*(..)) " method="afterReturning"/>  

spring 配置檔案。

 <context:annotation-config />

 <context:component-scan base-package="com.bjsxt"/>  <!-- 自動掃描 -->

 <aop:aspectj-autoproxy/>  <!-- 要新增本行 -->