五、Spring AOP面向切面编程(基于XML方式实现)

本章概要

  • Spring AOP基于XML方式实现(了解)
  • Spring AOP对获取Bean的影响理解
    • 根据类型装配 bean
    • 使用总结

5.6 Spring AOP基于XML方式实现(了解)

  1. 准备工作
  • 加入依赖

<dependency>
  <groupId>org.springframeworkgroupId>
  <artifactId>spring-aopartifactId>
  <version>6.0.6version>
dependency>

<dependency>
  <groupId>org.springframeworkgroupId>
  <artifactId>spring-aspectsartifactId>
  <version>6.0.6version>
dependency>
  • 准备代码

把测试基于注解功能时的Java类复制到新module中,去除所有注解。(本专栏的上一篇文章)

  1. 配置Spring配置文件

<bean id="calculatorPure" class="com.atguigu.aop.imp.CalculatorPureImpl"/>


<bean id="logAspect" class="com.atguigu.aop.aspect.LogAspect"/>


<aop:config>

  
  <aop:pointcut id="logPointCut" expression="execution(* *..*.*(..))"/>

  
  
  <aop:aspect ref="logAspect">
    
    
    
    <aop:before method="printLogBeforeCore" pointcut-ref="logPointCut"/>

    
    
    <aop:after-returning
      method="printLogAfterCoreSuccess"
      pointcut-ref="logPointCut"
      returning="targetMethodReturnValue"/>

    
    
    <aop:after-throwing
      method="printLogAfterCoreException"
      pointcut-ref="logPointCut"
      throwing="targetMethodException"/>

    
    <aop:after method="printLogCoreFinallyEnd" pointcut-ref="logPointCut"/>

    
    
  aop:aspect>

aop:config>
  1. 测试
@SpringJUnitConfig(locations = "classpath:spring-aop.xml")
public class AopTest {

    @Autowired
    private Calculator calculator;

    @Test
    public void testCalculator(){
        System.out.println(calculator);
        calculator.add(1,1);
    }
}

5.7 Spring AOP对获取Bean的影响理解

5.7.1 根据类型装配 bean

  1. 情景一
    • bean 对应的类没有实现任何接口
    • 根据 bean 本身的类型获取 bean
      • 测试:IOC容器中同类型的 bean 只有一个正常获取到 IOC 容器中的那个 bean 对象
      • 测试:IOC 容器中同类型的 bean 有多个会抛出 NoUniqueBeanDefinitionException 异常,表示 IOC 容器中这个类型的 bean 有多个
  2. 情景二
    • bean 对应的类实现了接口,这个接口也只有这一个实现类
      • 测试:根据接口类型获取 bean
      • 测试:根据类获取 bean
      • 结论:上面两种情况其实都能够正常获取到 bean,而且是同一个对象
  3. 情景三
    • 声明一个接口
    • 接口有多个实现类
    • 接口所有实现类都放入 IOC 容器
      • 测试:根据接口类型获取 bean会抛出 NoUniqueBeanDefinitionException 异常,表示 IOC 容器中这个类型的 bean 有多个
      • 测试:根据类获取bean正常
  4. 情景四
    • 声明一个接口
    • 接口有一个实现类
    • 创建一个切面类,对上面接口的实现类应用通知
      • 测试:根据接口类型获取bean正常
      • 测试:根据类获取bean无法获取原因分析:
    • 应用了切面后,真正放在IOC容器中的是代理类的对象
    • 目标类并没有被放到IOC容器中,所以根据目标类的类型从IOC容器中是找不到的

五、Spring AOP面向切面编程(基于XML方式实现)_第1张图片

  1. 情景五
    • 声明一个类
    • 创建一个切面类,对上面的类应用通知
      • 测试:根据类获取 bean,能获取到

五、Spring AOP面向切面编程(基于XML方式实现)_第2张图片

debug查看实际类型:

五、Spring AOP面向切面编程(基于XML方式实现)_第3张图片

5.7.2 使用总结
  • 对实现了接口的类应用切面

五、Spring AOP面向切面编程(基于XML方式实现)_第4张图片

  • 对没实现接口的类应用切面new

五、Spring AOP面向切面编程(基于XML方式实现)_第5张图片

  • 如果使用AOP技术,目标类有接口,必须使用接口类型接收IoC容器中代理组件!

你可能感兴趣的:(#,Spring,Framework,AOP基于XML方式实现,AOP对获取Bean的影响理解,根据类型装配,bean)