Spring AOP简介

AOP简介
  • Aspect Oriented Programming

    • 面向切面编程
  • AOP在Spring中的作用

    • 提供声明式服务(declarative enterprise services),尤其是声明式事务(declarative transaction management)
    • 允许用户实现自定义切面以完善OOP

    AOP is used in the Spring Framework to:
    1.provide declarative enterprise services, especially as a replacement for EJB declarative services. The most important such service is declarative transaction management.
    2.allow users to implement custom aspects, complementing their use of OOP with AOP.

  • AOP编程

    • 在运行时,将代码动态地切入到类的指定方法、指定位置上的编程思想
    • 通过动态代理的方式实现
    • 优点
      • 能够专注于核心业务的处理
      • 减少重复的代码
  • AOP关键概念

    • 关注点
      • concern
      • 一系列的业务,例如: 日志、安全检查
    • 切面
      • aspect
      • 一个关注点的模块化,这个关注点可能会横切多个
    • 连接点
      • join point
      • 程序中方法的执行
    • 通知
      • advice
      • 在切面上某个特定的连接点上执行的动作
      • before advice: 前置通知
      • after returning advice: 后置通知
      • after throwing advice: 异常通知
      • after (finally) advice: 最终通知
      • around advice: 环绕通知
    • 织入
      • weaving
      • 将切面连接到其他应用程序或者对象上,并创建一个通知对象

  • 使用Spring实现AOP
    • 通过Spring的API来实现AOP

      • 配置文件中需要添加aop相关的头文件
      • before advice前置通知的实现

        public class Log implements MethodBeforeAdvice{
            /*
             * @param method being invoked(被调用的方法的方法对象)
             * @param arguments to the method(被调用方法的参数)
             * @param target of the method invocation(被调用方法的目标对象)
             */
            @Override
            public void before(Method method, Object[] args, Object target) throws Throwable {
                System.out.println(target.getClass().getName() + "'s " + method.getName() + 
                        "() is executed");  
            }
        }
      • after returning advice实现

        public class AfterLog implements AfterReturningAdvice{
            /**
             * 目标方法执行后执行的通知
             * @param returnValue: 返回值
             * @param method: 被调用的方法对象
             * @param args: 方法参数
             * @param target: 被调用的方法的目标对象
             **/
            @Override
            public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
                System.out.println(target.getClass().getName() + "'s " + method.getName() + 
                        "has been executed successfully and return value is " + returnValue);
            }
        }
      • xml配置文件

        <?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"
            xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans.xsd
                http://www.springframework.org/schema/aop
                http://www.springframework.org/schema/aop/spring-aop.xsd">
            <bean id="userService" class="com.eric.service.impl.UserServiceImpl"></bean>
            <bean id="log" class="com.eric.log.Log"></bean>
            <bean id="afterLog" class="com.eric.log.AfterLog"></bean> 
            <aop:config>
                <!-- 切入点配置 
                     expression: 表示切入点的执行方法
                     x.y.Class.*(): 表示所有方法都作为切入点
                     x.y.Class.method(..): 表示匹配所有传入参数的格式
                     *用于匹配所有的类/方法
                     ..用于匹配所有的参数格式
                --> 
                <aop:pointcut expression="execution(* com.eric.service.impl.*.*(..))" id="pointcut"/>
                <!-- 配置执行的公共业务
                     advice-ref: 执行的公共业务方法
                     pointcut-ref: 切入点的引用
                 -->
                <aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
                <aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>
            </aop:config>
        </beans>
      • 测试类

        public class Test {
            public static void main(String[] args) {
                ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
                UserService userService = (UserService) ac.getBean("userService");
                userService.add(10);
                userService.delete();       
            }
        }/*output:
        com.eric.service.impl.UserServiceImpl's add() is executed
        add
        com.eric.service.impl.UserServiceImpl's addhas been executed successfully and return value is null
        com.eric.service.impl.UserServiceImpl's delete() is executed
        delete
        com.eric.service.impl.UserServiceImpl's deletehas been executed successfully and return value is null
        */
    • 自定义类实现AOP

      • 切面

        public class Log {
            public void before() {
                System.out.println("execute before method invocation");
            }
            public void after() {
                System.out.println("execute after method invocation");
            }
        }
      • 配置文件

        <bean id="userService" class="com.eric.service.impl.UserServiceImpl"></bean>
            <bean id="log" class="com.eric.log.Log"></bean> 
            <aop:config>
                <!-- 引用切面 -->
                <aop:aspect ref="log">
                    <!-- 配置连接点 -->
                    <aop:pointcut expression="execution(* com.eric.service.impl.*.*(..))" id="pointcut"/>
                    <!-- 配置前置通知 -->
                    <aop:before method="before" pointcut-ref="pointcut"/>
                    <!-- 配置后置通知 -->
                    <aop:after method="after" pointcut-ref="pointcut"/>
                </aop:aspect>
            </aop:config>
    • 使用注解实现AOP

      • 切面

        //表示切面
        @Aspect
        public class Log {
            @Before("execution(* com.eric.service.impl.*.*(..))")
            public void before() {
                System.out.println("execute before method invocation");
            }
            @After("execution(* com.eric.service.impl.*.*(..))")
            public void after() {
                System.out.println("execute after method invocation");
            }
        
            @Around("execution(* com.eric.service.impl.*.*(..))")
            public Object around(ProceedingJoinPoint jp) throws Throwable {
                System.out.println("---around before");
                System.out.println("sign:" + jp.getSignature());
                Object result = jp.proceed();
                System.out.println("---around after");
                return result;
            }
        }
      • 配置文件

        <?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"
            xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans.xsd
                http://www.springframework.org/schema/aop
                http://www.springframework.org/schema/aop/spring-aop.xsd">
            <bean id="userService" class="com.eric.service.impl.UserServiceImpl"></bean>
            <bean id="log" class="com.eric.log.Log"></bean>
            <aop:aspectj-autoproxy/>
        </beans>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值