一、面向切面编程AOP

  目标:让我们可以“专心做事”,避免繁杂重复的功能编码

  原理:将复杂的需求分解出不同方面,将公共功能集中解决

 

  *****所谓面向切面编程,是一种通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态添加功能的技术。

二、AOP相关术语

  1.增强处理(Advice)

    前置增强,后置增强,环绕增强、异常抛出增强、最终增强等。。。

  2.切入点(Pointcut)

  3.连接点(Join Point)

  4.切面(Aspect)

  5.目标对象(Target Object)

  6.AOP代理(AOP proxy)

  7.织入(Weaving)

三、使用Spring AOP实现日至输出

  1.在项目中添加Spring AOP的jar文件

  2.编写前置增强和后置增强实现日志功能

package aop;

import java.util.Arrays;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint; /**
*
* @author TengYiCheng
*
*/
public class UserServiceLogger {
private static final Logger logger = Logger.getLogger(UserServiceLogger.class);
/**
* 代表前置增强的方法
* @param jp
*/
public void before(JoinPoint jp){
logger.info("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法。方法入参:"+Arrays.toString(jp.getArgs()));
}
/**
* 代表后置增强的方法
* @param jp
* @param result
*/
public void afterReturning(JoinPoint jp,Object result){
logger.info("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法。方法返回值:"+result);
}
}

  3.编写Spring配置文件,对业务方法进行增强

 <?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="dao" class="dao.impl.UserInfoDaoImpl"></bean>
<bean id="service" class="service.impl.UserServiceImpl">
<property name="dao" ref="dao"></property>
</bean>
<bean id="theLogger" class="aop.UserServiceLogger"></bean>
<!-- AOP定义切入点 -->
<aop:config>
<!-- 定义一个切入点表达式 -->
<aop:pointcut id="pointcut" expression="execution(public int addUser(entity.UserInfo))"/>
<!-- 引用包含增强方法的Bean -->
<aop:aspect ref="theLogger">
<!-- 配置前置增强方法 -->
<aop:before method="before" pointcut-ref="pointcut"/>
<!-- 配置后置增强方法 -->
<aop:after-returning method="afterReturning" pointcut-ref="pointcut" returning="result"/>
</aop:aspect>
</aop:config>
</beans>

  4.编写代码获取带有增强处理的业务对象

package test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import entity.UserInfo;
import service.IUserService; /**
*
* @author TengYiCheng
*
*/
public class AOPLoggerTest {
@Test
public void aopTest(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
IUserService service = (IUserService) context.getBean("service");
UserInfo user = new UserInfo();
user.setId(10010);
user.setUserName("Test");
user.setUserPassword("123456");
user.setPhone("13201069939");
service.addUser(user);
}
}

最新文章

  1. 实现标记datagridview标题并导出Excel的功能
  2. ORACLE临时表空间
  3. Sass学习之路(5)——变量
  4. inverse理解
  5. Apache配置HTTPS功能
  6. IE7浏览器下CSS属性选择器二三事
  7. scala言语基础学习四
  8. HDU 4726 Kia&#39;s Calculation (贪心算法)
  9. CI框架学习——检查用户名与密码是否合法(二)
  10. iOS 之 Quartz2D
  11. php 实现购物车功能,以大苹果购物网为例,上图上代码。。。。
  12. spring+mybatis+c3p0数据库连接池或druid连接池使用配置整理
  13. Selenium 学习汇总
  14. Java之JSON操作(gson)
  15. java程序运存扩容
  16. java.lang.IllegalArgumentException: No Retrofit annotation found. (parameter #1) for method ApiService.getMethod
  17. 【51nod】1565 模糊搜索
  18. python Matplotlib数据可视化神器安装与基本应用
  19. eclipse+myeclipse 使用技巧备忘
  20. Java垃圾回收精粹 — Part2

热门文章

  1. 洛谷P5245 【模板】多项式快速幂
  2. memcached服务
  3. windows下webpack不是内部命令 解决方法
  4. Java的定时调度
  5. 高阶篇:4.2)DFMEA设计失效模式和失效后果分析-总章
  6. Q394 字符串解码
  7. QueryRunner(DBUtils) 结果集实例
  8. 动态时间规整DTW(Dynamic Time Warping )
  9. nginx常用配置3
  10. Android中调用高德导航(组件)