AOP的annotation实现方式是基于AspectJ的实现
来源:互联网 发布:去哪里学it 编辑:程序博客网 时间:2024/05/22 06:22
AOP的annotation实现方式是基于AspectJ的实现,需要以下几步:
首先,需要添加AspectJ的包:aspectjrt.jar aspectweaver.jar
其次,在applicationContext .xml文件中添加配置,否则不能使用aspectj的语法,在此之前,需要在引入AOP的命名空间xmlns:aop=http://www.springframework.org/schema/aop
再次,添加切面类
@Aspect
@Component
public class LogInterceptor {
@Before(“execution(public void com.bjsxt.dao.impl.UserDAOImpl.*(..))”)
public void beforeMethod(){ System.out.println("method before");}
@After(“execution(public void com.bjsxt.dao.impl.UserDAOImpl.*(..))”)
public void afterMethod(){ System.out.println("method after");}
@AfterReturning(“execution(public * com.bjsxt.dao.impl.UserDAOImpl.*(..))”)
public void afterReturning(){ System.out.println("method after returning");}
@AfterThrowing(“execution(public * com.bjsxt.dao.impl.UserDAOImpl.*(..))”)
public void afterThrowing(){ System.out.println("method throws exception");}
@Around(“execution(public * com.bjsxt.dao.impl.UserDAOImpl.*(..))”)
public void around(ProceedingJoinPoint pjp) throws Throwable{ System.out.println("method around start"); pjp.proceed(); System.out.println("method around end");}
}
@Before(“execution(public void com.bjsxt.dao.impl.UserDAOImpl.*(..))”)
这句话的意思是:在执行类com.bjsxt.dao.impl.UserDAOImpl中的任何类型的参数,任何返回值为空,访问类型为public的方法之前都会执行beforeMethod()方法。
@AfterThrowing(“execution(public * com.bjsxt.dao.impl.UserDAOImpl.*(..))”)
这句话所定义的通知是在所调用的函数抛出异常的时候才会调用
@AfterReturning(“execution(public * com.bjsxt.dao.impl.UserDAOImpl.*(..))”)
这句话所定义的通知是在所调用的函数正常返回的时候才会调用
@After(“execution(public void com.bjsxt.dao.impl.UserDAOImpl.*(..))”)
这句话定义的通知在程序返回之后(包括正常返回和抛出异常返回)会调用
@Around(“execution(public * com.bjsxt.dao.impl.UserDAOImpl.*(..))”)
around通知需要一个ProceedingJoinPoint 类型的参数pjp,并且在程序中需调用pjp.proceed();
User实体类:
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;
}
}
UserDAO的内容:
public interface UserDAO {
public void save(User user);
}
UserDAOImpl的内容:
@Component(“userDAOImpl”)
public class UserDAOImpl implements UserDAO {
public void save(User user) {
System.out.println(“user saved!”);
}
}
UserService的内容:
@Component(“userService”)
public class UserService {
private UserDAO userDAO;
public UserDAO getUserDAO() {
return userDAO;
}
@Resource(name=”userDAOImpl”)
public void setUserDAO( UserDAO userDAO) {
this.userDAO = userDAO;
}
public void add(User user) {
userDAO.save(user);
}
}
测试类的内容(使用Junit测试):
public class UserServiceTest {
@Test
public void testAdd() throws Exception {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(“beans.xml”);
UserService service = (UserService)ctx.getBean(“userService”);
service.add(new User());
}
}
最后,直接执行即可,运行结果:
method around start
method before
user saved!
method around end
method after
method after returning
通过观察不难发现,每个通知后面的切入点语法都是一样的,因此,此时可以定义一个切入点,然后不同的通知直接调用即可
@Aspect
@Component
public class LogInterceptor {
@Pointcut("execution(public * com.bjsxt.dao..*.*(..))")public void myMethod(){}@Before("myMethod()")public void beforeMethod(){ System.out.println("method before");}@After("myMethod()")public void afterMethod(){ System.out.println("method after");}@AfterReturning("myMethod()")public void afterReturning(){ System.out.println("method after returning");}@AfterThrowing("myMethod()")public void afterThrowing(){ System.out.println("method throws exception");}@Around("myMethod()")public void around(ProceedingJoinPoint pjp) throws Throwable{ System.out.println("method around start"); pjp.proceed(); System.out.println("method around end");}
}
运行程序,结果相同:
method around start
method before
user saved!
method around end
method after
method after returning
- AOP的annotation实现方式是基于AspectJ的实现
- Spring基于annotation的AOP(AspectJ)
- spring整合aspectj实现aop的;一个简单案例(annotation)
- 基于AspectJ实现AOP
- 基于Annotation的零配置方式--AspectJ
- Spring---->采用Annotation的方式实现AOP
- Spring AOP IOC 的 Annotation 实现方式
- AOP-AspectJ-基于XML的实现——各种通知
- spring2.0基于Annotation的AOP实现以及AOP事务
- 使用AspectJ提供的注解方式实现aop
- Spring AOP技术(基于AspectJ)的Annotation开发
- Spring AOP的实现机制(三)---@AspectJ形式的Spring AOP和基于Schema的AOP
- 基于@AspectJ的AOP
- 基于@AspectJ的AOP
- Annotation方式实现AOP
- AspectJ注解方式实现AOP
- AOP实现方式2——通过AspectJ提供的注解实现AOP
- AOP实现方式2——通过AspectJ提供的注解实现AOP
- unity3d 手机中Input类中touch详解_教程
- 五元素把握页面文字舒适感
- G1 垃圾收集器入门
- 第11周 项目3 点类派生直线类
- struts2的session的用法
- AOP的annotation实现方式是基于AspectJ的实现
- 程序调用的方式
- Gevent的socket协程安全性分析
- 直方图相似性计算
- OC语言核心语法
- JS导出数据到EXCEL
- 计算机网络学习(2)
- 关于Android Path
- 第11周 项目4 类族的设计