java切⾯注解_Java⾃学之spring:使⽤注解进⾏⾯向切⾯编程
(AOP)
学习⽬的:学会使⽤注解进⾏⾯向切⾯编程(AOP),实现在⾯向切⾯编程(AOP)中,使⽤XML配置完成的操作。
Part 1
修改cn.vaefun.dao.UserServiceImpl.java,在类上添加Component注解,告诉spring这是⼀个bean,并命名为userServiceImpl。
package cn.vaefun.dao;
import org.springframework.stereotype.Component;
import cn.vaefun.service.UserService;
@Component("userServiceImpl")
public class UserServiceImpl implements UserService {
public void add() {
System.out.println("添加⽤户");
}
public void delete() {
System.out.println("删除⽤户");
}
public void update() {
System.out.println("更新⽤户");
}
public void search() {
System.out.println("查⽤户");
}
}
Part 2
修改cn.vaefun.aspect.LoggerAspect.java,在类名前添加Aspect注解,告诉spring这是⼀个切⾯类;在类名前添加Componet注解,告诉spring这是⼀个bean;在本类before()⽅法前加Before注解,并添加value=(value = "execution(*
cn.vaefun.dao.UserServiceImpl.*(..))"),表明在UserServiceImpl中的⽅法执⾏之前,先执⾏该before()⽅法,同理after()⽅法表⽰⽅法执⾏之后要执⾏的⽅法(After注解)。
此外,还有很多注解⽅式,⽤以表⽰该⽅法在返回值、抛异常等之前或之后执⾏。
package cn.vaefun.aspect;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LoggerAspect {
@Before(value = "execution(* cn.vaefun.dao.UserServiceImpl.*(..))")
public void before(){
System.out.println("⽅法执⾏前");
}
@After(value = "execution(* cn.vaefun.dao.UserServiceImpl.*(..))")
public void after(){
System.out.println("⽅法执⾏后");
}
}
Part 3
修改配置⽂件
——(扫描cn.vaefun.aspect和cn.vaefun.dao两个包,定位业务类和切⾯类)
——到被注解了的切⾯类,进⾏切⾯配置
xmlns:xsi="/2001/XMLSchema-instance"
xmlns:aop="/schema/aop"
xmlns:tx="/schema/tx"
xmlns:context="/schema/context"
xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-3.0.xsd/schema/aop/schema/aop/spring-aop-
3.0.xsd/schema/tx/schema/tx/spring-tx-
3.0.xsd/schema/context/schema/context/spring-context-3.0.xsd/schema/aop/schema/aop/spring-aop.xsd"
>
Part 4
运⾏测试,输出如下信息,测试成功,完成学习⽬的。
package st;
import t.ApplicationContext;
import t.support.ClassPathXmlApplicationContext;
//import cn.vaefun.dao.UserServiceImpl;import cn.vaefun.service.UserService;
public class TestSpring {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("l");
UserService userService = (UserService) Bean("userServiceImpl");
userService.add();
userService.search();
}
}
Part 5
补充⼏点
使⽤注解的⽅式可能要⽐使⽤配置⽂件要慢,因为注解要调⽤反射,贼耗时,但是你不⽤再去在配置⽂件上费⼼。实际上,在实际⼯作时,⼤部分都是使⽤注解的⽅式。
同⼀个⽅法⾃定义多个AOP,我们如何指定他们的执⾏顺序呢?
⼀、通过实现Ordered接⼝,重写getOrder⽅法
@Component
@Aspect
@Slf4j
public class MessageQueueAopAspect1 implements Ordered{@Override
public int getOrder() {
// TODO Auto-generated method stub return 2;
}
......
}
⼆、通过注解
@Component
@Aspect自学编程的书籍
@Slf4j
@Order(1)
public class MessageQueueAopAspect1{
...
}
三、通过配置⽂件配置
结论
spring aop就是⼀个同⼼圆,要执⾏的⽅法为圆⼼,最外层的order最⼩。从最外层按照AOP1、AOP2的顺序依次执⾏doAround⽅
法,doBefore⽅法。然后执⾏method⽅法,最后按照AOP2、AOP1的顺序依次执⾏doAfter、doAfterReturn⽅法。也就是说对多个AOP来说,先before的,⼀定后after。
如果我们要在同⼀个⽅法事务提交后执⾏⾃⼰的AOP,那么把事务的AOP order设置为2,⾃⼰的AOP order设置为1,然后在doAfterReturn⾥边处理⾃⼰的业务逻辑。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论