AOP的全称: Aspact  Oriented  Programming

AOP的目标(作用):让我们可以“专心做事”  日志记录,事务处理,异常捕获,缓存操作。

AOP原理

将复杂的需求分解出不同方面,将散布在系统中的公共功能集中解决

采用代理机制组装起来运行,在不改变原程序的基础上对代码段进行增强处理,增加新的功能

AOP的使用

使用Spring AOP实现系统日志功能

步骤如下:

1.搭建分层架构

public class User implements Serializable{

private Integer id; // 用户ID

private String username; // 用户名

private String password; // 密码

}

2.创建数据访问层接口和实现类

接口

public interface IDaoAop {

public void save(User user);

}

实现类

public class UserDao implements IDaoAop {

public void save(User user) {

System.out.println("save success!");

}

}

3.创建业务逻辑层接口和实现类

public interface IUserBiz {

public void save(User user);

}

实现类

public class UserBiz implements IUserBiz{

private IDaAop dao;

public void save(User user) {

dao.save(user);

}

//dao 属性的setter访问器,会被Spring调用,实现设值注入

public void setDao(IDaoAop dao) {

this.dao = dao;

}

}

4.创建前置和后置 处理类

前置增强

import java.lang.reflect.Method;

import org.apache.log4j.Logger;

import org.springframework.aop.MethodBeforeAdvice;

public class LoggerBefore implements MethodBeforeAdvice {

private static final Logger log = Logger.getLogger(LoggerBefore.class);

public void before(Method arg0, Object[] arguments, Object target)

throws Throwable {

log.info("前置内容AAA");

}

}

后置增强

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;

public class LoggerAfter  implements AfterReturningAdvice{

public void afterReturning(Object returnValue, Method method, Object[] arguments,

Object target) throws Throwable {

System.out.println("后置增强代码");

}

}

5.

在Spring配置文件中完成业务对象和DAO的定义和装配,并定义了前置增强和后置增强组件

<bean id="dao" class ="全路径"/>

<bean id="dao" class ="全路径"/>

<property name="dao" ref="dao"></property>

</bean>

<!-- 定义前置增强组件 -->

<bean id="loggerBefore" class="全路径"/>

<!-- 定义后置增强组件 -->

<bean id="loggerAfter" class="全路径"/>

7.测试

public static void main(String[] args) {

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

IUserBiz biz=(IUserBiz)ctx.getBean("biz");

User user=new User();

biz.save(user);

System.out.println("success!");

切面: 横切关注点被模块化为特殊的类,这些类称为切面。

优点:每个关注点现在都集中于一处,而不是分散到多处代码中,服务模块更简洁,服务模块只需关注核心代码。

AOP术语

定义: 切面也需要完成工作。在AOP术语中,切面的工作被称为通知。

最新文章

  1. Kafka资源汇总
  2. AngularJS 路由
  3. [翻译]:怎样从C/C++代码中对C#进行回调
  4. 【转】DQL、DML、DDL、DCL的概念与区别
  5. 转载:Cocos2D-x 游戏接入 Windows 设备所需做的六件事
  6. angular-file-upload API angular文件上传插件
  7. __new__、__init__、__call__三个特殊方法
  8. 【Python】 SSH连接的paramiko
  9. STATE(状态)模式
  10. Python——错误笔记
  11. day14.生成器进阶,推导式
  12. Photos_2017 China MVP Community Connection
  13. Mac上实现Python用HTMLTestRunner生成html测试报告
  14. sass编写高质量的css---(基础语法结构)
  15. 学习笔记:Makefile的ifeq逻辑或,逻辑与的变通实现
  16. Spring集成shiro做登陆认证
  17. Error building Player: Exception: Could not start java
  18. C#枚举中使用Flags特性
  19. 剑指offer十八之二叉树的镜像
  20. java随机范围内的日期

热门文章

  1. ACM学习历程——UVA11234 Expressions(栈,队列,树的遍历,后序遍历,bfs)
  2. BZOJ3165:[HEOI2013]Segment
  3. Scala学习——array与arraybuffer的区别(初)
  4. fragment getActivity()空指针
  5. JS编写简易计算器
  6. DataTable批量插入数据库
  7. 抽象方法(abstract method) 和 虚方法 (virtual method), 重载(overload) 和 重写(override)的区别于联系
  8. Linux Ubuntu下Jupyter Notebook的安装
  9. 深度解析VC中的消息传递机制
  10. UnityShader实例09:Stencil Buffer&Stencil Test