Spring学习笔记(三)

Spring学习笔记(三)

AOP

一、使用Annotation方式实现AOP。步骤:

  1. xml里加入配置:<aop:aspectj-autoproxy />

    <?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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="
                http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    
        <context:annotation-config />
        <context:component-scan base-package="com.wangj.spring" />
        <aop:aspectj-autoproxy />
    
    </beans>
  2. 再引入如下jar包:(注意:必须引入第三个jar)
  3. @Aspect注解这个类
  4. @Before @After等来注解方法
  5. 写明切入点(execution(...))
  6. 将拦截器类交给Spring管理(@Component注解这个类)

    @Aspect
    @Component
    public class LogInterceptor {
        @Before("execution(public void com.wangj.spring.dao.impl.UserDaoImpl.save(com.wangj.spring.model.User))")
        public void before() {
            System.out.println("method before");
        }
    
        @After("execution(public void com.wangj.spring.dao.impl.UserDaoImpl.save(com.wangj.spring.model.User))")
        public void after() {
            System.out.println("method after(finally)");
        }
    }

二、织入点语法

execution(public * *(..)) // 作用于任何类任何方法
execution(* set*(..)) // 作用于任何以set开头的方法
execution(* com.wangj.spring.dao.impl.UserDaoImpl.*(..)) //作用于UserDaoImpl类的所有方法
execution(* com.wangj.spring.dao..*.*(..)) //作用于com.wangj.spring.dao包(包括所有子包)里的所有类的所有方法
execution(public void com.wangj.spring.dao.impl.UserDaoImpl.save(com.wangj.spring.model.User)) // 作用于UserDaoImpl类的save(User)方法

三、Annotation详解

  1. @Pointcut 织入点集合

@Aspect
@Component
public class LogInterceptor {
    @Pointcut("execution(* com.wangj.spring.dao..*.*(..))")
    public void pointcutMethod() {}

//    @Before("execution(public void com.wangj.spring.dao.impl.UserDaoImpl.save(com.wangj.spring.model.User))")
    @Before("pointcutMethod()")
    public void before() {
        System.out.println("method before");
    }

//    @After("execution(public void com.wangj.spring.dao.impl.UserDaoImpl.save(com.wangj.spring.model.User))")
    @After("pointcutMethod()")
    public void after() {
        System.out.println("method after(finally)");
    }
}

  2. @Before @After @AfterReturning @AfterThrowing @Around

@Aspect
@Component
public class LogInterceptor {
    @Pointcut("execution(* com.wangj.spring.dao..*.*(..))")
    public void pointcutMethod() {}

//    @Before("execution(public void com.wangj.spring.dao.impl.UserDaoImpl.save(com.wangj.spring.model.User))")
    @Before("pointcutMethod()")
    public void before() {
        System.out.println("method before");
    }

//    @After("execution(public void com.wangj.spring.dao.impl.UserDaoImpl.save(com.wangj.spring.model.User))")
    @After("pointcutMethod()") // 方法执行完切入即使方法产生了异常
    public void after() {
        System.out.println("method after(finally)");
    }

    @AfterReturning("pointcutMethod()") // 方法正常执行完后切入
    public void afterReturning() {
        System.out.println("method afterReturning");
    }

    @AfterThrowing("pointcutMethod()") // 方法抛出异常时切入
    public void afterThrowing() {
        System.out.println("method afterThrowing");
    }

    @Around("myMethod()") // 环绕即在方法前、后都可以加逻辑
    public void aroundMethod(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("method around start");
        pjp.proceed();
        System.out.println("method around end");
    }
}

四、使用XML方式实现AOP

<?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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <context:annotation-config />
    <context:component-scan base-package="com.wangj.spring" />
    <!-- <aop:aspectj-autoproxy /> -->

    <bean id="logInterceptor" class="com.wangj.spring.aop.LogInterceptor2"></bean>

    <aop:config>
        <aop:pointcut id="daoPointcut" expression="execution(public * com.wangj.spring.dao..*.*(..)))"></aop:pointcut>
        <aop:aspect id="logAspect" ref="logInterceptor">
            <!-- <aop:before method="before" pointcut="execution(public * com.wangj.spring.dao..*.*(..))" /> --> <!-- 不使用全局pointcut -->
            <aop:before method="before" pointcut-ref="daoPointcut" />
            <aop:after method="after" pointcut-ref="daoPointcut" />
            <aop:after-returning method="afterReturning" pointcut-ref="daoPointcut" />
            <aop:after-throwing method="afterThrowing" pointcut-ref="daoPointcut"/>
            <aop:around method="aroundMethod" pointcut-ref="daoPointcut"/>
        </aop:aspect>
    </aop:config>

</beans>
时间: 2024-12-15 01:49:33

Spring学习笔记(三)的相关文章

Spring学习笔记三(AOP中的那些事)

1.前言 前两篇博客介绍了一下,Spring中的IOC容器,这篇来讲解一下Spring中的AOP的知识.  2.AOP基础知识 2.1 概念 AOP是一种面向切面编程,一种软件工程的编程范式.AOP关注的是程序中的共性的功能,开发时,将共性功能抽取出来制作成独立的模块,此时原始代码中将不再具有这些被抽取出来的共性功能代码.因此加强了代码的复用性,同时程序开发时可以只考虑个性化功能,不需要考虑共性的功能. 2.2 基本知识点 连接点:具有特定功能的方法,一般方法 切入点:具有共性功能的方法的统称的

Spring学习笔记(三)之装配Bean

除了组件扫描与自动装配之外还有基于Java代码的装配与基于XML的装配. 有一些场景是我们不能用自动装配的,比如我们要给第三方库中的组件装配到我们的应用中,这时自动装配无效,因为自动装配只能扫描本应用中的包. 这时我们就要在基于代码代码的装配和基于XML的装配中进行选择,前面我们说到了JavaConfig相比XML更强大更安全. 一.基于Java代码的装配Bean(JavaConfig) 但是JavaConfig又与Java有所区别. 概念上  JavaConfig是配置 与应用的其他代码业务逻

Spring Batch学习笔记三:JobRepository

此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch Job在运行时有很多元数据,这些元数据一般会被保存在内存或者数据库中,由于Spring Batch在默认配置是使用HSQLDB,也就是说在Job的运行过程中,所有的元数据都被储存在内存中,在Job结束后会随着进程的结束自动消失:在这里我们推荐配置JobRepository去使用MySQL. 在这种情况下,Spring Batch在单次执行或者从一个执行到另外一个执行的时候会使用数据库去维护状态,Job执行的信息包

不错的Spring学习笔记(转)

Spring学习笔记(1)----简单的实例 ---------------------------------   首先需要准备Spring包,可从官方网站上下载.   下载解压后,必须的两个包是spring.jar和commons-logging.jar.此外为了便于测试加入了JUnit包.   在Myeclipse中创建Java项目.   编写一个接口类,为了简单,只加入了一个方法.   Java代码   1.package com.szy.spring.interfacebean;  

spring学习笔记(一) Spring概述

博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书.  强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring的优势在哪里?怎么系统的学习Spring? 一.什么是Spring? Spring是一个开源的轻量级Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发. 那有人就会问了,Spring是如何简化开发的? 在传统开发中,一个应用是需

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle&lt;T&gt;

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T> 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现和源码 下一篇用它们做一个多语言的demo 这两个是事件的订阅和广播,很强大,但用的时候要小心发生不必要的冲突. 先看一下它的实现思想 在Caliburn.Micro里EventAggregator要以单例的形式出现这样可以

Spring学习笔记(一)

Spring学习笔记(一) Spring核心思想: IOC:  Inversion Of Control (控制反转) / DI: Dependency Injection (依赖注入) AOP: Aspect Oriented Programming (面向切面编程) IOC 1. 简单的应用 Model package com.wangj.spring.model; public class User { private String username; private String pas

OpenCV for Python 学习笔记 三

给源图像增加边界 cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value) src:源图像 top,bottem,left,right: 分别表示四个方向上边界的长度 borderType: 边界的类型 有以下几种: BORDER_REFLICATE # 直接用边界的颜色填充, aaaaaa | abcdefg | gggg BORDER_REFLECT # 倒映,abcdefg | gfedcbamn | nmabcd

NFC学习笔记——三(在windows操作系统上安装libnfc)

本篇翻译文章: 这篇文章主要是说明如何在windows操作系统上安装.配置和使用libnfc. 一.基本信息 1.操作系统: Windows Vista Home Premium SP 2 2.硬件信息: System: Dell Inspiron 1720 Processor: Intel Core 2 Duo CPU T9300 @ 2.5GHz 2.5GHz System type: 32-bit Operating System 3.所需软件: 在windows操作系统上安装软件需要下列