热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

我的spring之旅之AOP编程

AOP介绍aop(aspectorientedprogramming)面向切面(方面)编程,是对所有对象或者是一类对象编程,核心是(在不增加代码的基础上,还增加新功能)

AOP介绍

aop( aspect oriented programming ) 面向切面(方面)编程,是对所有对象或者是一类对象编程,核心是( 在不增加代码的基础上, 还增加新功能 ),也是spring的核心技术之一。

AOP术语

1.切面(aspect):要实现的交叉功能,是系统模块化的一个切面或领域。如日志记录。
2.连接点:应用程序执行过程中插入切面的地点,可以是方法调用,异常抛出,或者要修改的
字段。
3.通知:切面的实际实现,他通知系统新的行为。如在日志通知包含了实
现日志功能的代码,如向日志文件写日志。通知在连接点插入到应用系统中。
4.切入点:定义了通知应该应用在哪些连接点,通知可以应用到AOP框架支持的任何连接点。
5.引入:为类添加新方法和属性。
6.目标对象:被通知的对象。既可以是你编写的类也可以是第三方类。
7.代理:将通知应用到目标对象后创建的对象,应用系统的其他部分不用为了支持代理对象而
改变。
8.织入:将切面应用到目标对象从而创建一个新代理对象的过程。织入发生在目标
对象生命周期的多个点上:
编译期:切面在目标对象编译时织入.这需要一个特殊的编译器.
类装载期:切面在目标对象被载入JVM时织入.这需要一个特殊的类载入器.
运行期:切面在应用系统运行时织入.

sp18

通知种类

sp19

快速入门

step

1、新建一个接口TestServiceInter

public interface TestServiceInter {

public void sayHello();
}

2、新建一个目标对象Test1Service类,并实现TestServiceInter接口


public class Test1Service implements TestServiceInter {

private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public void sayHello() {
// TODO Auto-generated method stub
System.out.println("hi "+name);
}
}

3、前置MethodBeforeAdvice使用


public class MyMethodBeforeAdvice implements MethodBeforeAdvice {

/**
* method: 被调用方法名字
* args: 给method传递的参数
* target: 目标对象
*/

public void before(Method method, Object[] args, Object target)
throws Throwable {
// TODO Auto-generated method stub
System.out.println("记录日志..."+"方法名称:"+method.getName()+" 目标对象:"+target);

}

}

4、配置bean
4-1、配置被代理的对象

id="test1Service" class="com.ydc.aop.Test1Service">
<property name="name" value="ydc" />

4-2、配置MethodBeforeAdvice通知

id="MyMethodBeforeAdvice" class="com.ydc.aop.MyMethodBeforeAdvice" />

4-3、配置代理对象

<bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean">

<property name="proxyInterfaces">
<list>
<value>com.ydc.aop.TestServiceIntervalue>
list>
property>

<property name="interceptorNames">

<value>MyMethodBeforeAdvicevalue>
property>

<property name="target" ref="test1Service" />
bean>

5、运行测试

sp20

看见没,MethodBeforeAdvice的作用就是在目标对象(Test1Service)调用sayHello()方法前先调起MethodBeforeAdvice的before函数,但该函数并没有在任何地方显示调用,并且该方法可以获取到目标对象(Test1Service)的好多信息,这样一来,可在目标对象的方法调用之前可以做一些事情,比如写入日志。

6、让目标对象再实现TestServiceInter2接口


public interface TestServiceInter2 {

public void sayBye();
}

public class Test1Service implements TestServiceInter,TestServiceInter2 {

private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public void sayHello() {
// TODO Auto-generated method stub
System.out.println("hi "+name);
}

public void sayBye() {
// TODO Auto-generated method stub
System.out.println("bye "+name);
}

}

7、增加代理接口


<bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean">

<property name="proxyInterfaces">
<list>
<value>com.ydc.aop.TestServiceIntervalue>
<value>com.ydc.aop.TestServiceInter2value>
list>
property>

<property name="interceptorNames">

<value>MyMethodBeforeAdvicevalue>
property>

<property name="target" ref="test1Service" />
bean>

8、测试运行

sp21

看见没,可以在多个点切入。

AOP基本原理

sp22

9、AfterReturningAdvice后置通知

9-1、新建后置通知


public class MyAfterReturningAdvice implements AfterReturningAdvice{

@Override
public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
// TODO Auto-generated method stub

System.out.println("执行完"+arg1.getName()+"之后关闭资源");

}

}

9-2、配置后置通知

id="MyAfterReturningAdvice" class="com.ydc.aop.MyAfterReturningAdvice" />

9-3、把后置通知织入到代理对象

<property name="interceptorNames">

<list>
<value>MyMethodBeforeAdvicevalue>
<value>MyAfterReturningAdvicevalue>
list>

property>

10、再次运行我们的程序

sp23

看见没,我们可以使用后置通知AfterReturningAdvice在目标对象执行完某一个函数之后做一下业务。

11、MethodInterceptor 通知的使用

11-1、新建MethodInterceptor通知


public class MyAroundAdvice implements MethodInterceptor{

@Override
public Object invoke(MethodInvocation arg0) throws Throwable {

System.out.println("调用方法前:");

Object object=arg0.proceed();

System.out.println("调用方法后:");

return object;
}

}

11-2、配置MethodInterceptor通知

id="MyAroundAdvice" class="com.ydc.aop.MyAroundAdvice" />

11-3、把MethodInterceptor通知织入到代理对象


<property name="interceptorNames">

<list>
<value>MyMethodBeforeAdvicevalue>
<value>MyAfterReturningAdvicevalue>
<value>MyAroundAdvicevalue>
list>

property>

12、测试运行

sp24

看见没有,其实MethodInterceptor通知的作用=MethodBeforeAdvice作用+AfterReturningAdvice作用。

13、ThrowsAdvice 通知的使用

13-1、新建异常通知

package com.ydc.aop;

import java.lang.reflect.Method;

import org.springframework.aop.ThrowsAdvice;


public class MyThrowsAdvice implements ThrowsAdvice {


public void afterThrowing(Method m, Object[] os, Object target, Exception e) {

System.out.println("出大事了"+e.getMessage());
}
}

13-2、配置ThrowsAdvice通知

id="MyThrowsAdvice" class="com.ydc.aop.MyThrowsAdvice" />

13-3、把ThrowsAdvice通知织入到代理对象


<property name="interceptorNames">

<list>
<value>MyMethodBeforeAdvicevalue>
<value>MyAfterReturningAdvicevalue>
<value>MyAroundAdvicevalue>
<value>MyThrowsAdvicevalue>
list>

property>

14、测试运行

sp25

看见没,ThrowsAdvice通知主要是在抛出异常的地面切入,这样一来可以统计项目的异常崩溃信息,非常有价值。

15、bean的完整配置


<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
>



<bean id="test1Service" class="com.ydc.aop.Test1Service">
<property name="name" value="ydc" />
bean>

<bean id="MyMethodBeforeAdvice" class="com.ydc.aop.MyMethodBeforeAdvice" />
<bean id="MyAfterReturningAdvice" class="com.ydc.aop.MyAfterReturningAdvice" />
<bean id="MyAroundAdvice" class="com.ydc.aop.MyAroundAdvice" />
<bean id="MyThrowsAdvice" class="com.ydc.aop.MyThrowsAdvice" />

<bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean">

<property name="proxyInterfaces">
<list>
<value>com.ydc.aop.TestServiceIntervalue>
<value>com.ydc.aop.TestServiceInter2value>
list>
property>

<property name="interceptorNames">

<list>
<value>MyMethodBeforeAdvicevalue>
<value>MyAfterReturningAdvicevalue>
<value>MyAroundAdvicevalue>
<value>MyThrowsAdvicevalue>
list>

property>

<property name="target" ref="test1Service" />
bean>
beans>

推荐阅读
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • 本文详细解析了如何使用 jQuery 实现一个在浏览器地址栏运行的射击游戏。通过源代码分析,展示了关键的 JavaScript 技术和实现方法,并提供了在线演示链接供读者参考。此外,还介绍了如何在 Visual Studio Code 中进行开发和调试,为开发者提供了实用的技巧和建议。 ... [详细]
  • Spring框架入门指南:专为新手打造的详细学习笔记
    Spring框架是Java Web开发中广泛应用的轻量级应用框架,以其卓越的功能和出色的性能赢得了广大开发者的青睐。本文为初学者提供了详尽的学习指南,涵盖基础概念、核心组件及实际应用案例,帮助新手快速掌握Spring框架的核心技术与实践技巧。 ... [详细]
  • 如何在Java中高效构建WebService
    本文介绍了如何利用XFire框架在Java中高效构建WebService。XFire是一个轻量级、高性能的Java SOAP框架,能够简化WebService的开发流程。通过结合MyEclipse集成开发环境,开发者可以更便捷地进行项目配置和代码编写,从而提高开发效率。此外,文章还详细探讨了XFire的关键特性和最佳实践,为读者提供了实用的参考。 ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • 本文深入解析了 Apache 配置文件 `httpd.conf` 和 `.htaccess` 的优化方法,探讨了如何通过合理配置提升服务器性能和安全性。文章详细介绍了这两个文件的关键参数及其作用,并提供了实际应用中的最佳实践,帮助读者更好地理解和运用 Apache 配置。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • 结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法
    结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • Java中高级工程师面试必备:JVM核心知识点全面解析
    对于软件开发人员而言,随着技术框架的不断演进和成熟,许多高级功能已经被高度封装,使得初级开发者只需掌握基本用法即可迅速完成项目。然而,对于中高级工程师而言,深入了解Java虚拟机(JVM)的核心知识点是必不可少的。这不仅有助于优化性能和解决复杂问题,还能在面试中脱颖而出。本文将全面解析JVM的关键概念和技术细节,帮助读者全面提升技术水平。 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • 深入解析Tomcat:开发者的实用指南
    深入解析Tomcat:开发者的实用指南 ... [详细]
  • 本课程详细介绍了如何使用Python Flask框架从零开始构建鱼书应用,涵盖高级编程技巧和实战项目。通过视频教学,学员将学习到Flask的高效用法,包括数据库事务处理和书籍交易模型的实现。特别感谢AI资源网提供的课程下载支持。 ... [详细]
  • 本文详细解析了 MySQL 5.7.20 版本中二进制日志(binlog)崩溃恢复机制的工作流程。假设使用 InnoDB 存储引擎,并且启用了 `sync_binlog=1` 配置,文章深入探讨了在系统崩溃后如何通过 binlog 进行数据恢复,确保数据的一致性和完整性。 ... [详细]
author-avatar
mobiledu2502885053
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有