栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java练习(十九):编写代码,实现对UserServiceImpl的aop的@Around操作 (两种写法)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java练习(十九):编写代码,实现对UserServiceImpl的aop的@Around操作 (两种写法)

目录

1. 要求

2. 涉及的知识点

3. 示例工程 (第一种方式)

3.1 maven的配置文件: pom.xml 

3.2 bean配置文件: bean_aop_around.xml

3.3 接口和类的代码

3.3.1 接口:UserService

3.3.2 实现接口的类:UserServiceImpl

3.3.3 AroundLog类:AroundLog

3.4 测试类 

4. 示例工程(第二种方式)

4.1 maven的配置文件: pom.xml 

4.2 bean配置文件: bean_aop_around2.xml

4.3 接口和类的代码

4.3.1 接口:UserService

4.3.2 实现接口的类:UserServiceImpl

4.3.3 AnnotationPointcut类:

4.4 测试类 


1. 要求

之前完成了通过@Before和@After的方式,完成了对类UserServiceImpl中的search方法的aop操作 ,这里要求:通过@Aspect注解的方式实现对UserServiceImpl的aop的@Around操作!

前文:

Java练习(十):Spring应用之AOP(简单工程示例)_sulia1234567890的博客-CSDN博客

2. 涉及的知识点

@Before, @After, @Around三者之前的关系:

@Before是在所拦截方法执行之前执行一段逻辑。

@After 是在所拦截方法执行之后执行一段逻辑。

@Around是可以同时在所拦截方法的前后执行一段逻辑。

简言之,@Around就包含了@Before和@After两个操作。

3. 示例工程 (第一种方式)

 

3.1 maven的配置文件: pom.xml 


    4.0.0

    org.example
    MySpringAOPAround
    1.0-SNAPSHOT

    
        8
        8
    

    
        
            org.springframework
            spring-webmvc
            5.3.3
        

        
            org.aspectj
            aspectjweaver
            1.9.4
        

        
            dom4j
            dom4j
            1.6.1
        

        
            junit
            junit
            4.12
            test
        

    

3.2 bean配置文件: bean_aop_around.xml



    
    
    
    



    
    
        
        



        
    



3.3 接口和类的代码

3.3.1 接口:UserService
package com.my.spring.aop.around;

public interface UserService {
    public void add();
    public void delete();
    public void update();
    public void search();
}

3.3.2 实现接口的类:UserServiceImpl
package com.my.spring.aop.around;

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("查询用户");
    }
}

3.3.3 AroundLog类:AroundLog
package com.my.spring.aop.around;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class AroundLog implements MethodInterceptor {
    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        String name = invocation.getMethod().getName();
        System.out.println("环绕通知: " + name + "方法即将开始!");
        // 调用目标对象的指定方法
        //真正调用目标方法
        Object result = invocation.proceed();
        System.out.println("环绕通知: " + name + "方法到此结束!");
        return result;
    }
}

3.4 测试类 
package com.my.spring.around.demo;

import com.my.spring.aop.around.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MySpringAOPAroundTest {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean_aop_around.xml");
        UserService userService = (UserService) context.getBean("userService");
        userService.search();
    }

}

输出结果:
环绕通知: search方法即将开始!
查询用户
环绕通知: search方法到此结束!

4. 示例工程(第二种方式)

用 @Aspect, @Around

简言之,就是简化了bean配置文件里的内容,设置语句自动扫描,在工程中找标签 @Aspect, @Around等。

4.1 maven的配置文件: pom.xml 
同3.1,这里不赘述。

4.2 bean配置文件: bean_aop_around2.xml



    
    
    
    

    


4.3 接口和类的代码

4.3.1 接口:UserService
package com.my.spring.aop.around;

public interface UserService {
    public void add();
    public void delete();
    public void update();
    public void search();
}

4.3.2 实现接口的类:UserServiceImpl
package com.my.spring.aop.around;

public class UserServiceImpl implements UserService{
    public void add() {
        System.out.println("增加用户2");
    }
    public void delete() {
        System.out.println("删除用户2");
    }
    public void update() {
        System.out.println("更新用户2");
    }
    public void search() {
        System.out.println("查询用户2");
    }
}

4.3.3 AnnotationPointcut类:

类似于第一种方法中的AroundLog类,实现环绕效果,方法的调用

package com.my.spring.aop.around;

// 如果自动扫描,那么程序肯定找标签
// 在整个工程里找标签,即如果包含多个类文件,多个@Aspect,程序都会找到并执行。
// 但真实的情况下,同一个方法,不会用多个@Around

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class AnnotationPointcut {
    

    @Around("execution(* com.my.spring.aop.around.UserServiceImpl.*(..))")
    public void around(ProceedingJoinPoint jp) throws Throwable{
        System.out.println("~~~~~~~~~~~~~~~~Around方法执行前~~~~~~~~~~~~~~~~~~~~~");
        System.out.println("签名: "+jp.getSignature());
        Object proceed = jp.proceed(); //执行目标方法
        System.out.println("~~~~~~~~~~~~~~~~Around方法执行后~~~~~~~~~~~~~~~~~~~~~");
    }
}

4.4 测试类 
package com.my.spring.around.demo;

import com.my.spring.aop.around.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MySpringAOPAroundTest2 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean_aop_around2.xml");
        UserService userService = (UserService) context.getBean("userService2");
        userService.search();
    }
}

输出结果:

~~~~~~~~~~~~~~~~Around方法执行前~~~~~~~~~~~~~~~~~~~~~
签名: void com.my.spring.aop.around.UserService.search()
查询用户2
~~~~~~~~~~~~~~~~Around方法执行后~~~~~~~~~~~~~~~~~~~~~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/270303.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号