为什么80%的码农都做不了架构师?>>>   

AOP 的重要概念

1  切面

切面编程(事务, 日志, 安全) 编程实现 在实际应用中通常是存放切面的普通java 类 需要通过配置<bean>标识指定

2  通知

通知是切面的具体表现,亿ro目标作为参照点,根据位置的不同,又分为  (前置通知, 后置通知 , 异常通知, 环绕通知)调用时 需要指定具体位置。

3 切入点

切入点用于定义通知到什么连接点去。

4  目标对象

目标对象指定的是织入切面的对象

5 代理对象

通过目标对象应用之后,被动态创建的对象, 代理对象的功能相当与目标对象中核心业务逻辑功能加上方面代码实现的功能

6 织入

织入是将切面应用到目标对象 ,从而创建一个新的代理对象的过程。

代码实现

基于代理类ProxyFactoryBean实现AOP

package com.sun.dao;

public interface UserDao {

//添加用户

//删除用户

public void delUser(int id);

public void addUser(String username, String password);

}

package com.sun.dao;
public class UserDaoImpl implements UserDao {
public void addUser(String username, String password) {
// TODO Auto-generated method stub
System.out.println("添加用户"+username+"成功");
}
public void delUser(int id) {
// TODO Auto-generated method stub
System.out.println("删除"+id+"成功");
}
}

package com.sun.biz;
public interface UserBiz {
public void addUser(String username,String password);
//删除用户
public void delUser(int id);
}

package com.sun.biz;
import com.sun.dao.UserDao;
public class UserBizImpl implements UserBiz {
UserDao userdao;
public UserDao getUserdao() {
return userdao;
}
public void setUserdao(UserDao userdao) {
this.userdao = userdao;
}
public void addUser(String username, String password) {
// TODO Auto-generated method stub
userdao.addUser(username, password);
}
public void delUser(int id) {
// TODO Auto-generated method stub
userdao.delUser(id);
}
}

package com.sun.aop;
import java.lang.reflect.Method;
import org.apache.log4j.Logger;
import org.springframework.aop.MethodBeforeAdvice;
public class LoggerAdvice implements MethodBeforeAdvice {
private Logger logger = Logger.getLogger(LoggerAdvice.class);
public void before(Method method, Object[] args, Object target)
throws Throwable {
// TODO Auto-generated method stub
String targetClassName = target.getClass().getName();
//h获取被调用的方法名
String targetMethodName=method.getName();
//日志格式字符串
String loginInfoText = "前置通知"+targetClassName+"类的"+targetMethodName+"方法开始执行";
logger.info(loginInfoText);
}

创建log4j.properties
log4j.rootLogger=info,stdout,info,debug,error
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%n
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%n
log4j.appender.info.datePattern='.'yyyy-MM-dd
log4j.appender.info.Threshold = INFO 
log4j.appender.info.append=true
log4j.appender.info.File=${webApp.root}/WEB-INF/logs/info.log
log4j.logger.debug=debug
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.layout=org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%n
log4j.appender.debug.datePattern='.'yyyy-MM-dd
log4j.appender.debug.Threshold = DEBUG 
log4j.appender.debug.append=true
log4j.appender.debug.File=${webApp.root}/WEB-INF/logs/debug.log
log4j.logger.error=error
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%n
log4j.appender.error.datePattern='.'yyyy-MM-dd
log4j.appender.error.Threshold = ERROR 
log4j.appender.error.append=true
log4j.appender.error.File=${webApp.root}/WEB-INF/logs/error.log 

将业务逻辑代码 和 方面代码 组装到代理类中
是用Spring 配置文件来实现ApllicationContext.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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<!-- 配置创建UserDAOImpl的实例 -->
<bean id="userDAO" class="com.sun.dao.UserDaoImpl">
</bean>
<!-- 配置创建UserBizImpl的实例 -->
<bean id="userBiz" class="com.sun.biz.UserBizImpl">
<!-- 依赖注入数据访问层组件 -->
<property name="userdao" ref="userDAO" />
</bean>
<!-- 定义前置通知 -->
<bean id="logAdvice" class="com.sun.aop.LoggerAdvice"></bean>
<!-- 定义代理类,名 称为ub,将通过ub访问业务类中的方法 -->
<bean id="ub" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.sun.biz.UserBiz</value>
</property>
<property name="interceptorNames">
<list>
<value>logAdvice</value>
</list>
</property>
<property name="target" ref="userBiz"></property>
</bean>
</beans>

编制测试类
package com.sun.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.sun.biz.UserBiz;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//装配UserbIZimpl事例化
UserBiz userbiz = (UserBiz) context.getBean("ub");
userbiz.addUser("wangming", "485487");
userbiz.delUser(1);
}
}

结果显示
[INFO ] [16:11:10] org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1060478: display name [org.springframework.context.support.ClassPathXmlApplicationContext@1060478]; startup date [Mon Sep 17 16:11:10 CST 2012]; root of context hierarchy
[INFO ] [16:11:10] org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [applicationContext.xml]
[INFO ] [16:11:10] org.springframework.context.support.ClassPathXmlApplicationContext - Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@1060478]: org.springframework.beans.factory.support.DefaultListableBeanFactory@11daa0e
[INFO ] [16:11:10] org.springframework.beans.factory.support.DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@11daa0e: defining beans [userDAO,userBiz,logAdvice,ub]; root of factory hierarchy
[INFO ] [16:11:10] com.sun.aop.LoggerAdvice - 前置通知com.sun.biz.UserBizImpl类的addUser方法开始执行
添加用户wangming成功
[INFO ] [16:11:10] com.sun.aop.LoggerAdvice - 前置通知com.sun.biz.UserBizImpl类的delUser方法开始执行
删除1成功

成功

转载于:https://my.oschina.net/sunzy/blog/78956

面向方面编程(Spring AOP)相关推荐

  1. AOP Aspect Oriented Programming 面向切面编程 Spring

    AOP的概述 什么是AOP的技术? Aspect Oriented Programming 的缩写 意为:面向切面编程. AOP是一种编程范式,属于软件工程范畴.指导开发者如何组织程序结构. 利用AO ...

  2. Spring | 深入理解面向切面编程(AOP)

    个人主页:BoBooY的CSDN博客_Java领域博主 前言:这节我们来学习什么是面向切面编程(AOP),为了方便大家理解,我们先了解代理模式再学习AOP. 文章目录 代理模式 7.1.静态代理 7. ...

  3. Spring面向切面编程(AOP)详解

    Spring面向切面编程(AOP)详解 面向切面编程(AOP)是Spring框架的另外一个重要的核心内容. 而在讲AOP之前,先来了解一下动态代理这个概念,因为AOP基于动态代理. 动态代理概念:在程 ...

  4. Spring之面向切面编程(AOP)

    目录 1. 面向切面编程 2. AOP核心概念 3. AOP的实现 ​4. Spring 对AOP支持 4.1 支持@Aspect 4.2 声明一个切面 4.3 声明一个切入点 4.4 声明增强 5. ...

  5. SpringBoot面向切面编程-用AOP方式管理日志

    面向切面编程 认识AOP AOP(Aspect Oriented Program,面向切面编程)把业务功能分为核心.非核心两部分. 核心业务功能 非核心业务功能 用户登录,增加数据,删除数据 性能统计 ...

  6. Java中的面向切面编程(AOP)

    一.什么是AOP? Aspect Oriented Programming ,即面向切面编程. AOP是对面向对象编程的一个补充. 它的目的是将复杂的需求分解为不同的切面,将散布在系统中的公共功能集中 ...

  7. 【AOP 面向切面编程】AOP 简介 ( AspectJ 简介 | AspectJ 下载 )

    文章目录 一.AOP 简介 二.AspectJ 简介 三.AspectJ 下载 一.AOP 简介 AOP 是 Aspect Oriented Programming 的缩写 , 面向切面编程 ; 利用 ...

  8. C# 中使用面向切面编程(AOP)中实践代码整洁

    1. 前言 最近在看<架构整洁之道>一书,书中反复提到了面向对象编程的 SOLID 原则(在作者的前一本书<代码整洁之道>也是被大力阐释),而面向切面编程(Aop)作为面向对象 ...

  9. Atitit 面向对象编程(OOP)、面向组件编程(COP)、面向方面编程(AOP)和面向服务编程(SOP)的区别和联系...

    Atitit 面向对象编程(OOP).面向组件编程(COP).面向方面编程(AOP)和面向服务编程(SOP)的区别和联系 1. 面向组件编程(COP) 所以,组件比起对象来的进步就在于通用的规范的引入 ...

  10. C# 中使用面向切面编程(AOP)中实践代码整洁(转)

    出处:https://www.cnblogs.com/chenug/p/9848852.html 1. 前言 最近在看<架构整洁之道>一书,书中反复提到了面向对象编程的 SOLID 原则( ...

最新文章

  1. 源码安装nginx开启SSL功能
  2. C++中函数调用操作符的重载
  3. PHP的JSON封装
  4. 模拟网页行为之实践篇二
  5. Serverless实战之路
  6. 95-910-170-源码-FlinkSQL-Flink SQL 中的流和动态表
  7. django关于Mysql增删改查操作以及浏览器数据返回
  8. 计算机网络概述的功能 组成,计算机网络的概述
  9. python中的sys模块和os_python中os和sys模块的区别与常用方法总结
  10. 数据结构学习笔记(二) 线性表的顺序存储和链式存储
  11. android防全家桶html5,不要再用全家桶浏览器了!五款轻量级安卓浏览器,体积小,功能强...
  12. 2个网卡配置相同ip 华为交换机_华为交换机如何配置管理IP地址、如何修改管理IP地址...
  13. oracle 函数 如何编写
  14. win10无法运行jre java_win10系统无法安装jre的解决方法
  15. 国内免费高匿IP代理软件
  16. 30岁开始学编程晚吗?
  17. 【Java】保留两位小数(不四舍五入)
  18. 记录项目中遇到的坑(二)
  19. 架构师之路-秒杀系统优化思路
  20. ionic 实现广告图片无限滚动标签介绍

热门文章

  1. 10.5 QQ 支持
  2. Java 中 StringBuilder 在高性能用法总结
  3. python中的is
  4. centos下安装nginx
  5. HTML5 Maker – 在线轻松制作 HTML5 动画效果
  6. 解决Delphi7的自带的UTF-8编码转换函数BUG
  7. [LeetCode] Remove Duplicates from Sorted Array II
  8. 安卓 激活应用组件 intent
  9. C语言 字符串和指针
  10. 能买到鸿蒙系统,哪里能买到鸿蒙系统的设备?