首页 > 其他分享 >【Spring实战】第4章 面向切面的Spring

【Spring实战】第4章 面向切面的Spring

时间:2023-05-11 19:24:26浏览次数:45  
标签:实战 Spring void aop public 切面 Performance performance class

POM 依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>4.0.7.RELEASE</version>
</dependency>
<!-- Spring AOP 依赖 AspectJ,不然会报 ReflectionWorldException-->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.7.2</version>
</dependency>

使用注解配置 AOP

我的代码

代码地址

开启 AOP

使用 @EnableAspectJAutoProxy 开启 AOP

@Configuration
@EnableAspectJAutoProxy // 启用自动代理
@ComponentScan
public class AopConfig {}

方式一:调用目标对象的方法,被代理类拦截

使用 @Aspect 定义切面

@Component
@Aspect // 注意:pom.xml 中 aspectjweaver 的 scope 为 runtime 的话,该注解会报红
public class Audience {
    /*
    切点表达式:
        * aop.Performance.perform(..)
        返回任意类型 全限定类名.方法名(任意参数列表)
    */
    @Pointcut("execution(* aop.Performance.perform(..))")
    public void performance() {
    }
    // 指定接收的参数
    @Pointcut("execution(* aop.Performance.playTrack(int)) && args(number)")
    public void trackPlayed(int number) {
    }
    @Before("performance()")
    public void silenceCellPhone() {
        System.out.println("Before");
    }
    @Around("trackPlayed(int)")
    public void watchPerformance(ProceedingJoinPoint jp) {
        try {
            System.out.println("Around start");
            jp.proceed(); // 被代理的实际方法
            jp.proceed(new Object[]{2}); // 替换传入的参数为 2
            System.out.println("Around end");
        } catch (Throwable ignored) {
        }
    }
}

方式二:代理暴露新接口,底层没有实现这些接口

@Component
@Aspect
public class EncoreableIntroducer {
    @DeclareParents(value = "aop.Performance+", defaultImpl = DefaultEncoreable.class)
    public static Encoreable encoreable;

}

测试类

RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AopConfig.class)
public class AopTest {
    @Autowired
    private Performance performance;
    @Test
    public void test1() {
        performance.perform();
        // 引用新功能,即使类没有实现这个接口
        Encoreable encoreable = (Encoreable) this.performance;
        encoreable.performEncore();
    }
    @Test
    public void  test2() {
        performance.playTrack(1);
    }
}

标签:实战,Spring,void,aop,public,切面,Performance,performance,class
From: https://www.cnblogs.com/seolas/p/17391948.html

相关文章

  • Spring MVC官方文档学习笔记(一)之Web入门
    注:该章节主要为原创内容,为后续的SpringMVC内容做一个先行铺垫1.Servlet的构建使用(1)选择Maven->webapp来构建一个web应用(2)构建好后,打开pom.xml文件,一要注意打包方式为war包,二导入servlet依赖,如下<!--打war包--><packaging>war</packaging><!--导入servlet依赖......
  • SpringBoot 接口并发限制(Semaphore)
    可以使用JMeter辅助测试 https://blog.csdn.net/weixin_45014379/article/details/124190381@RestController@RequestMapping({"/Test"})publicclasstest{Loggerlogger=LoggerFactory.getLogger(this.getClass());//使用Semaphore并发限制3个超过阻......
  • ssm springboot
    IOC解析Config.class得到扫描路径遍历路径下所有的java类,存在Component注解就存在专用map中(BeanDefinitionMap)根据相应的规则生成BeanName为key,类作为value核心类BeanDefinition类型作用域懒加载初始化方法销毁方法BeanDefinitionReaderBeanFactoryApplicationCon......
  • 这个字段我明明传了呀,为什么收不到 - Spring 中首字母小写,第二个字母大写造成的参数问
    问题现象vSwitchId、uShape、iPhone...这类字段名,有什么特点?很容易看出来吧,首字母小写,第二个字母大写。它们看起来确实是符合Java中对字段所推崇的“小驼峰命名法”,即第一个单词小写,后面的单词首字母大写。但是,如果你在项目中给POJO类的字段以这种形式进行命名的话,那么可能......
  • OpenSeadragon 实战系列其他属性的使用
    viewport的使用我们打开openseadragn的官网,可以找到下图所示的viewport点开viewport,你可以看到很多viewport的方法那么如何使用viewport呢?在基础篇中的示例代码中,我们定义了viewer1varviewer=OpenSeadragon({2id:"openseadragon1",3......
  • OpenSeadragon 实战系列第三方插件
    序言在我们的项目中,一般不可能只是简单的显示图片,对应着还需要做一些图像标注、图像颜色过滤等操作,比如一些医学病理切片。所以openseadragon也为我们提供了一些插件,我们打开官网,找到plugins这些插件中有很多是中间件,各位根据自己的需求自行研究把,在我的项目中只使用......
  • SpringMVC18_SpringMVC获得请求数据5
    一、获得请求参数-请求参数类型 二、获得请求参数-获得基本类型参数  三、获得请求参数-获得POJO类型参数 四、获得请求参数-获得数组类型参数1  五、获得请求参数-获得集合类型参数2  六、获得请求参数-获得集合类型参数3  七、获得请求参数-静态资源......
  • SpringBoot中@ControllerAdvice/@RestControlAdvice+@ExceptionHandler实现全局异常捕
    场景在编写Controller接口时,为避免接口因为未知的异常导致返回不友好的结果和提示。如果不进行全局异常捕获则需要对每个接口进行try-catch或其他操作。 可以对Controller进行全局的异常捕获和处理,一旦发生异常,则返回通用的500响应码与通用错误提示。并将异常发生的具体的......
  • OpenSeadragon 实战系列dzi图像切割命名规则篇
    序言根据前边的两篇文章,我们已经可以实现图像的显示了。但是现在我们显示的还是由微软软件自动生成的图片,在实际运用中,需要由后端将图片切割,具体切割方式在微软的dzi图片格式说明中也有,地址:https://docs.microsoft.com/en-us/previous-versions/windows/silverlight/dotnet-wi......
  • spring
    问题idea创建maven项目过慢使用阿里云镜像在maven的conf\settings.xml中新加一个阿里云的镜像地址:<mirror><id>alimaven</id><mirrorOf>central</mirrorOf><name>aliyunmaven</name><url>http://mav......