简介:
AOP通知类型
以下示例:
BookDao.java
- /*
- 定义dao接口
- */
- public interface BookDao{
- public void save();
- public void update();
- }
BookDaoimpl.java
- @Repository
- public class BookDaoImpl implements BookDao {
- public void save() {
- System.out.println("book dao save...");
- }
-
- public void update() {
- System.out.println("book dao update...");
- }
- }
SpringConfig.java
- @Configuration // 配置
- @ComponentScan("com.lhj") //扫描包
- @EnableAspectJAutoProxy // 对应配合Aspect使用,(aop注解)
- public class SpringConfig{
- }
MyAdvice.java
- @Component
- @Aspect
- public class MyAdvice{
- //切入点
- @Pointcut("execution(void com.lhj.dao.BookDao.update())")
- private void pt(){}
-
-
- @Before("pt()") //前置通知
- public void before(){
- System.out.println("Hello!")
- }
-
-
- @After("pt()") //后置通知
- public void before(JoinPoint jp){
- // 可以拿到参数返回值,本次案例均为无参
- //Object[] args = jp.getArgs();
- //并且返回值可以修改
- // args[0] = 666;
- System.out.println("Hello!")
- }
-
- @Around("pt()") //环绕通知
- public Object aroundSelect(ProceedingJoinPoint pjp) throws Throwable {
- Signature signature = pjp.getSignature(); // 一次执行的签名信息
- String className = signature.getDeclaringTypeName(); //执行的文件目录
- String nenthodName = signature.getName(); //执行方法名称
- System.out.println("ONE Hello!")
- // 对原始操作的调用
- Object ret = pjp.proceed();
- System.out.println("TWO Hello!")
- return ret;
- }
-
- //正常结束后运行,此处ret和下方参数对应
- @AfterReturning(value="pt()",returning="ret")
- public void afterReturning(Object ret) {
- //ret 可以获取返回值
- System.out.println("Hello!")
- }
-
- @AfterThrowing("pt()") //抛出异常后运行
- public void AfterThrowing() {
- System.out.println("Hello!")
- }
-
- }
test.java
- public class App {
- public static void main(String[] args) {
- ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
- BookDao bookDao = ctx.getBean(BookDao.class);
- bookDao.update();
- }
- }
1.所有代码按照标准规范开发
2.描述切入点通常描述接口,而不描述实现类
3.访问控制修饰符针对接口开发均采用public描述(可省略访问控制修饰符描述)
4.返回值类型对于增删改类使用精准类型加速匹配,对于查询类使用*通配快速描述
5.包名书写尽量不使用..匹配,效率过低,常用*做单个包描述匹配,或精准匹配
6.接口名/类名书写名称与模块相关的采用*匹配,例如UserService书写成*Service,绑定业务层接口名
7.方法名书写以动词进行精准匹配,名词采用*匹配,例如getByld书写成getBy*,selectAl书写成selectAl
8.参数规则较为复杂,根据业务方法灵活调整
9.通常不使用异常作为匹配规则