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/> <!-- 要新增本行 -->