• (续)SSM整合之spring笔记(AOP 基于注解的AOP之前置通知)(P101)


    一 .基于注解的AOP之前置通知

    1 .开启基于注解的AOP

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:aop="http://www.springframework.org/schema/aop"
    6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
    7. <context:component-scan base-package="com.atguigu.spring.aop.annotation">context:component-scan>
    8. <aop:aspectj-autoproxy />
    9. beans>

    2 .@Before:前置通知,在目标对象方法执行之前执行

    1. package com.atguigu.spring.aop.annotation;
    2. import org.aspectj.lang.annotation.Aspect;
    3. import org.aspectj.lang.annotation.Before;
    4. import org.springframework.stereotype.Component;
    5. /*1、在切面中,需要通过指定的注解将方法标识为通知方法
    6. * @Before:前置通知,在目标对象方法执行之前执行
    7. *
    8. * */
    9. @Component
    10. @Aspect //将当前组件标识为切面
    11. public class LoggerAspect {
    12. @Before("execution(public int com.atguigu.spring.aop.annotation.CalculatorImpl.add(int, int))")
    13. public void beforeAdviceMethod() {
    14. System.out.println("LoggerAspect,前置通知");
    15. }
    16. }

     


    3  测试

    假设获取的是目标对象

    1. public class AOPByAnnotationTest {
    2. @Test
    3. public void testAOPByAnnotation(){
    4. //获取IOC容器
    5. ApplicationContext ioc = new ClassPathXmlApplicationContext("aop-annotation.xml");
    6. //获取目标对象
    7. CalculatorImpl calculator = ioc.getBean(CalculatorImpl.class);
    8. calculator.add(10, 1);
    9. }
    10. }

     

    刚会报如下错误

    org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.atguigu.spring.aop.annotation.CalculatorImpl' available

    CalculatorImpl的bean没有找到  不可用

    但是我们在CalculatorImpl里面已经加了@Component  也已经扫描了   但是从IOC容器中获取不到  

    这就如同 我们之前所说的代理模式一样的   我们只要为目标对象创建了代理对象  我们每一次要访问 我们都是通过代理对象 间接访问  已经不能直接通过目标对象进行访问了 

    我们不知道代理类叫什么名字  要如何获取支对象呢?
    虽然不知道代理类叫什么 但是他和目标对象 实现的是同一个接口

    如同我们之前做动态代理时 不知道叫什么 但是可以通过向上转型来创建接口的对象  

    所以这里我们也是 通过IOC来获取某个Bean的时候 ,我们不需要通过一个具体的一个类型来获取 

    我们可以用所继承的父类或所实现的接口进行获取  

    通过代理对象获取 

    正确的

    1. public class AOPByAnnotationTest {
    2. @Test
    3. public void testAOPByAnnotation(){
    4. //获取IOC容器
    5. ApplicationContext ioc = new ClassPathXmlApplicationContext("aop-annotation.xml");
    6. //获取目标对象
    7. // CalculatorImpl calculator = ioc.getBean(CalculatorImpl.class);
    8. //获取代理对象
    9. Calculator calculator = ioc.getBean(Calculator.class);
    10. calculator.add(10, 1);
    11. }
    12. }

     

     

  • 相关阅读:
    堆友:阿里巴巴文生图工具又出新功能(局部重绘)
    3D模型格式转换工具HOOPS Exchange:如何将3D PDF转换为STEP格式?
    面试经典150题——Day33
    AcWing---转圈游戏---快速幂
    【ROS2原理11】C++编程的要点
    windows 电脑改成安卓桌面
    LeetCode算法二叉树—二叉树的中序遍历
    “Python+”集成技术高光谱遥感数据处理与机器学习深度应用丨高光谱数据预处理-机器学习-深度学习-图像分类-参数回归等12个专题
    2023国赛数学建模E题思路代码 - 黄河水沙监测数据分析
    WebSocket Day02 : 握手连接
  • 原文地址:https://blog.csdn.net/m0_59281987/article/details/127722370