Spring aop实例介绍详解编程语言

Spring aop实例介绍

在Spring 2.0中,Pointcut的定义包括两个部分:Pointcut表示式(expression)和Pointcut签名(signature)。让我们先看看execution表示式的格式:
括号中各个pattern分别表示修饰符匹配(modifier-pattern?)、返回值匹配(ret-type-pattern)、类路径匹配(declaring-type-pattern?)、方法 名匹配(name-pattern)、参数匹配((param-pattern))、异常类型匹配(throws-pattern?),其中后面跟着“?”的是可选项。
在各个pattern中可以使用“*”来表示匹配所有。在(param-pattern)中,可以指定具体的参数类型,多个参数间用“,”隔开,各个也可以用“*”来表示匹配任意类型的参数,如(String)表示匹配一个String参数的方法;(*,String)表示匹配有两个参数的方法,第一个参数可以是任意类型,而第二个参数是String类型;可以用(..)表示零个或多个任意参数。
现在来看看几个例子:
1)execution(* *(..))
表示匹配所有方法
2)execution(public * com. savage.service.UserService.*(..))
表示匹配com.savage.server.UserService中所有的公有方法
3)execution(* com.savage.server..*.*(..))
表示匹配com.savage.server包及其子包下的所有方法
除了execution表示式外,还有within、this、target、args等Pointcut表示式。一个Pointcut定义由Pointcut表示式和Pointcut签名组成;

<dependency> 
    <groupId>org.aspectj</groupId> 
    <artifactId>aspectjrt</artifactId> 
    <version>1.8.4</version> 
</dependency> 
 
<dependency> 
    <groupId>org.aspectj</groupId> 
    <artifactId>aspectjweaver</artifactId> 
    <version>1.8.4</version> 
    <scope>runtime</scope> 
</dependency>

注解的使用:

此段小代码演示了spring [email protected] @Before @After三个注解的区别

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

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

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


1.定义application-aop.xml文档

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:aop="http://www.springframework.org/schema/aop" 
       xmlns:context="http://www.springframework.org/schema/context" 
       xsi:schemaLocation=" 
       http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context-3.0.xsd 
       http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
       http://www.springframework.org/schema/aop 
       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> 
    <context:annotation-config /> 
    <context:component-scan base-package="test.aop"/> 
    <aop:aspectj-autoproxy /> 
</beans>


2.Aop拦截,注解方式配置切面

package test.aop; 
import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.After; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 
import org.aspectj.lang.annotation.Pointcut; 
import org.springframework.stereotype.Component; 
 
/** 
 * Created by Administrator on 2017/3/28 0028. 
 * 通过aop拦截后执行具体操作 
 */ 
@Aspect 
@Component 
public class LogIntercept { 
 
    @Pointcut("execution(public * test.aop.*.*(..))") 
    public void recordLog(){} 
 
    @Before("recordLog()") 
    public void before() { 
        this.printLog("已经记录下操作日志@Before 方法执行前"); 
    } 
 
    @Around("recordLog()") 
    public void around(ProceedingJoinPoint pjp) throws Throwable{ 
        this.printLog("已经记录下操作日志@Around 方法执行前"); 
        pjp.proceed(); 
        this.printLog("已经记录下操作日志@Around 方法执行后"); 
    } 
 
    @After("recordLog()") 
    public void after() { 
        this.printLog("已经记录下操作日志@After 方法执行后"); 
    } 
 
    private void printLog(String str){ 
        System.out.println(str); 
    } 
}

3.测试

package test.aop; 
 
import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.Signature; 
import org.aspectj.lang.reflect.SourceLocation; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
import org.springframework.stereotype.Controller; 
 
/** 
 * Created by Administrator on 2017/3/28 0028. 
 */ 
@Controller 
public class UserAction { 
 
    public void queryUsers(){ 
 
        System.out.println("查询所有用户【all users list"); 
    } 
 
    public static void main(String[] args) { 
 
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("application-aop.xml"); 
 
        UserAction userAction = (UserAction)ctx.getBean("userAction"); 
        userAction.queryUsers(); 
 
        ctx.destroy(); 
    } 
} 

4.输出结果


信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContex[email protected]: startup date [Tue Mar 28 10:55:57 GMT+08:00 2017]; root of context hierarchy

三月 28, 2017 10:55:58 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions

信息: Loading XML bean definitions from class path resource [application-aop.xml]

[email protected] 方法执行前

[email protected] 方法执行前

三月 28, 2017 10:55:58 上午 org.springframework.context.support.AbstractApplicationContext doClose

信息: Closing org.springframework.context.support.ClassPathXmlApplicationContex[email protected]: startup date [Tue Mar 28 10:55:57 GMT+08:00 2017]; root of context hierarchy

查询所有用户【all users list】

[email protected] 方法执行后

[email protected] 方法执行后

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/13569.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论