14.Spring之AOP基于Xml的配置
Spring之AOP基于Xml的配置
基于注解的AOP配置步骤:
将目标类和切面类都加入到ioc容器中。
告诉Spring那个是切面类--@Aspect
在切面类中使用五个通知注解来配置切面中的这些通知方法都何时何地地运行。
开启基于注解的AOP功能–<aop:aspectj-autoproxy />
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051<?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:context="http://www.springframework ...
13.Spring之AOP多切面通知方法的运行顺序
Spring之AOP多切面通知方法的运行顺序
指定切面的优先级
在同一个连接点上应用不止一个切面时,除非明确指定,否则它们的优先级是不确定的。
切面的优先级可以通过实现Ordered接口或利用@Order注解指定。
实现Ordered接口,getOrder()方法的返回值越小,优先级越高。
若使用@Order注解,序号出现在注解中
12.Spring之AOP通知方法总结
[toc]
Spring之AOP通知方法
前面我们在切面类中已经使用到了四个通知方法,其作用你应该已经了然于胸,再此再做一下总结:
在具体的连接点上要执行的操作。
一个切面可以包括一个或者多个通知。
通知所使用的注解的值往往是切入点表达式。
1. 前置通知
前置通知:在方法执行之前执行的通知
使用@Before注解
2. 后置通知
后置通知:后置通知是在连接点完成之后执行的,即连接点返回结果或者抛出异常的时候
使用@After注解
3. 返回通知
返回通知:无论连接点是正常返回还是抛出异常,后置通知都会执行。如果只想在连接点返回的时候记录日志,应使用返回通知代替后置通知。
使用@AfterReturning注解,在返回通知中访问连接点的返回值
在返回通知中,只要将returning属性添加到@AfterReturning注解中,就可以访问连接点的返回值。该属性的值即为用来传入返回值的参数名称
必须在通知方法的签名中添加一个同名参数。在运行时Spring AOP会通过这个参数传递返回值
4. 异常通知
异常通知:只在连接点抛出异常时才执行异常通知
将thr ...
11.Spring之AOP细节
[toc]
Spring之AOP细节1. 细节一
通知方法的执行顺序:
`正常执行:@Before前置通知 – @After后置通知 – @AfterReturning正常返回``
``异常执行:@Before前置通知 – @After后置通知 – @AfterThrowing方法异常`
2. 细节二
切入点表达式通常都会是从宏观上定位一组方法,和具体某个通知的注解结合起来就能够确定对应的连接点。那么就一个具体的连接点而言,我们可能会关心这个连接点的一些具体信息,例如:当前连接点所在方法的方法名、当前传入的参数值等等。这些信息都封装在JoinPoint接口的实例对象中。
只需要为通知方法的参数列表上写一个参数,JoinPoint joinPoint:封装了当前目标方法的详细信息。
jointPoint.getArgs() 获取目标方法运行时使用的参数
joinPoint.getSignature() 获取到方法签名
signature.getName() 获得方法名
public static void logStart(JoinPoint joinPoint);
3. 细 ...
10.Spring之AOP切入点表达式
Spring之AOP切入点表达式1. 切入点表达式的写法
execution(访问权限符 返回值类型 方法全类名(参数表))
2. 通配符 *
匹配一个或多个字符:execution(public int cn.justweb.calculator.impl.*Impl.*(int,int))
匹配任意一个参数 :第一个是int类型,第二个参数任意类型:(匹配两个参数)
execution(public int cn.justweb.calculator.impl.*Impl.*(int,*))
权限修饰符位置不能使用*,不写就是全匹配
3. 通配符 ..
匹配任意多个参数,任意类型参数
匹配任意多层路径 execution(public int cn.justweb..impl.*Impl.*(int,*))
4. 记住两种写法
最精确的 execution(public int cn.justweb.calculator.impl.CalculatorImpl.add(int,int))
最模糊的 execution(* *.*(..)) 千万别写,了解一下
...
9.Spring之AOP概述
Spring之AOP概述
AOP(Aspect-Oriented Programming,面向切面编程):是一种新的方法论,是对传统 OOP(Object-Oriented Programming,面向对象编程)的补充。
AOP编程操作的主要对象是切面(aspect),而切面模块化横切关注点。
在应用AOP编程时,仍然需要定义公共功能,但可以明确的定义这个功能应用在哪里,以什么方式应用,并且不必修改受影响的类。这样一来横切关注点就被模块化到特殊的类里——这样的类我们通常称之为“切面”。
AOP的好处:
每个事物逻辑位于一个位置,代码不分散,便于维护和升级
业务模块更简洁,只包含核心业务代码
1. AOP专业术语
1.1 横切关注点
从每个方法中抽取出来的同一类非核心业务。
1.2 切面(Aspect)
封装横切关注点信息的类,每个关注点体现为一个通知方法。
1.3 通知(Advice)
切面必须要完成的各个具体工作
1.4 目标(Target)
被通知的对象
1.5 代理(Proxy)
向目标对象应用通知之后创建的代理对象
1 ...
8.Spring之AOP前奏
Spring之AOP前奏1. 提出问题
情景:数学计算器要求:
执行加减乘除运算
日志:在程序执行期间追踪正在发生的活动
验证:希望计算器只能处理正数的运算
常规实现
Calculator
123456789101112 /** * @Date 2020/5/23 23:23 * @Version 10.21 * @Author DuanChaojie */public interface Calculator { int add(int m,int n); int sub(int m,int n); // ...}
CalculatorImpl
123456789101112131415161718192021222324/** * @Date 2020/5/23 23:24 * @Version 10.21 * @Author DuanChaojie */public class CalculatorImpl implements Calculator { public int add(int m, ...
7.Spring之泛型依赖注入
[toc]
Spring之泛型依赖注入
Spring 4.x中可以为子类注入子类对应的泛型类型的成员变量的引用。
1. 引入依赖123456789101112131415161718192021222324<dependencies> <!--测试所用的包--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!--spring框架所用包,有四个--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> ...
6.Spring测试单元使用总结
1. Spring测试单元使用总结第一步:添加相关依赖
Spring单元测试包spring-test-4.0.0.RELEASE.jar
第二步:指定Spring配置文件的位置
@ContextConfiguration(locations = "classpath:applicationContext.xml")
第三步:指定单元测试驱动
默认是junit
@RunWith(SpringJUnit4ClassRunner.class)
第四步:代码演示12345678@ContextConfiguration(locations = "classpath:applicationContext.xml")@RunWith(SpringJUnit4ClassRunner.class)public class SpringTest { @Test public void test(){ System.out.println("测试Spring的单元测试"); }& ...
5.Spring中通过注解的方式配置Bean
1. 注解的方式配置Bean
首先我们先明白手动装配和自动装配的概念:
手动装配:以value或ref的方式明确指定属性值都是手动装配。
自动装配:根据指定的装配规则,不需要明确指定,Spring自动将匹配的属性值注入bean中。
1.1 装配模式
autowire = “byName/byType”
根据类型自动装配:将类型匹配的bean作为属性注入到另一个bean中。若IOC容器中有多个与目标bean类型一致的bean,Spring将无法判定哪个bean最合适该属性,所以不能执行自动装配
根据名称自动装配:必须将目标bean的名称和属性名设置的完全相同
通过构造器自动装配:当bean中存在多个构造器时,此种自动装配方式将会很复杂。不推荐使用。
12345678910111213<!-- byName:根据id来匹配,唯一匹配 byType:根据类型来匹配,能够匹配当前类型及其子类型。 默认是根据byName来匹配的--><bean id="cart" class="cn.justweb.autowire. ...