#基于代理类的AOP实现:
step1:
1 package com.sjl.factorybean;
/**切面类*/
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation; public class MyAspect implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation mi) throws Throwable {
check_Permission();
//用proceed方法来执行当前对象
Object obj=mi.proceed();
log();
return obj;
} //目标方法执行前执行check_Permission方法
public void check_Permission(){
System.out.println("模拟检查权限日志");
} //目标方法执行后执行log()方法
public void log(){
System.out.println("模拟记录日志");
}
}
#目标类:
package com.sjl.jdk; /**
* UserDaoImpl是目标类,对其中的方法进行增强处理;
*/
public class UserDaoImpl implements UserDao{ @Override
public void addUser() {
System.out.println("添加用户");
} @Override
public void deleteUser() {
System.out.println("删除用户");
}
}
#step2:创建配置文件,并指定代理对象:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd"> <!-- 1 目标类 id为"userDao" class="目标类的全限定名" -->
<bean id="userDao" class="com.sjl.jdk.UserDaoImpl"></bean> <!-- 2 切面类 id为"myAspect" class="切面类的全限定名"-->
<bean id="myAspect" class="com.sjl.factorybean.MyAspect"></bean> <!-- 3 使用Spring代理工厂定义一个名称为userDaoProxy的代理对象,而aop
实现的就是代理工厂 bean id全限定名为如上图-->
<bean id="userDaoProxy"
class="org.springframework.aop.framework.ProxyFactoryBean"> <!-- 3.1 指定代理实现的接口proxyInterfaces value为com.sjl.jdk.UserDao-->
<property name="proxyInterfaces" value="com.sjl.jdk.UserDao" /> <!-- 3.2 指定目标对象名为target 目标类的对象属性ref为目标类的id-->
<property name="target" ref="userDao" /> <!-- 3.3 指定切面名interceptorNames,织入环绕通知myAspect -->
<property name="interceptorNames" value="myAspect" /> <!-- 3.4 指定代理方式,true:使用cglib,false(默认):使用jdk动态代理 -->
<property name="proxyTargetClass" value="true" /> </bean>
</beans> <!--用配置文件指定代理对象,包括目标类、切面类,并指定Spring代理工厂定义一个名称为
userDaoProxy的代理对象,其中包含接口的id 代理工厂的类,从aop的包中找,指定接口,再
指定属性,接口,目标对象,切面和代理方式等-->
#step3:测试类
package com.sjl.factorybean;
import org.springframework.context.ApplicationContext;
import
org.springframework.context.support.ClassPathXmlApplicationContext;
import com.sjl.jdk.UserDao;
// 测试类
public class ProxyFactoryBeanTest {
public static void main(String args[]) {
String xmlPath = "applicationContext.xml";
ApplicationContext applicationContext =new ClassPathXmlApplicationContext(xmlPath);
// 从Spring容器获得内容
UserDao userDao = (UserDao) applicationContext.getBean("userDaoProxy");
// 执行方法
userDao.addUser();
userDao.deleteUser();
}
}
说明:动态代理的本质是反射,动态代理分为实现有两种:jdk代理(实现接口的实例,拦截接口定义的目标方法)、cglib代理(生成代理类的子类的实例,可以拦截任意一共有方法,
无论目标方法是否定义在接口中),而动态代理是AOP的本质。
Spring AOP(基于代理类的AOP实现)的更多相关文章
-
Spring框架学习07——基于传统代理类的AOP实现
在Spring中默认使用JDK动态代理实现AOP编程,使用org.springframework.aop.framework.ProxyFactoryBean创建代理是Spring AOP 实现的最基 ...
-
代理类和AOP
客户端不用调用目标对象了,直接调用代理类.最终目标方法还是去实行了. 代理类的每个方法调用目标类的相同方法,并且在调用方法时候加上系统功能的代码 代理和目标实现了相同的接口,有相同的方法.通过接口进行 ...
-
Spring IoC — 基于Java类的配置
普通的POJO只要标注@Configuration注解,就可以为Spring容器提供Bean定义的信息了,每个标注了@Bean的类方法都相当于提供一个Bean的定义信息. 基于Java类的配置方法和基 ...
-
基于代理类实现Spring AOP
目录 ProxyFactoryBean类介绍 基于JDK动态代理的Spring AOP实现 基于CGLIB代理的Spring AOP实现 Spring的通知类型 ProxyFactoryBean类 ...
-
java代理类及AOP
1.代理架构图 2.AOP 3.动态代理概念 4.动态代理工作原理图
-
Spring框架学习08——自动代理方式实现AOP
在传统的基于代理类的AOP实现中,每个代理都是通过ProxyFactoryBean织入切面代理,在实际开发中,非常多的Bean每个都配置ProxyFactoryBean开发维护量巨大.解决方案:自动创 ...
-
spring aop 基于schema的aop
AOP的基本概念: 连接点(Jointpoint):表示需要在程序中插入横切关注点的扩展点,连接点可能是类初始化.方法执行.方法调用.字段调用或处理异常等等,Spring只支持方法执行连接点,在AOP ...
-
Spring之旅第五篇-AOP详解
一.什么是AOP? Aspect oritention programming(面向切面编程),AOP是一种思想,高度概括的话是“横向重复,纵向抽取”,如何理解呢?举个例子:访问页面时需要权限认证,如 ...
-
Spring AOP学习笔记05:AOP失效的罪因
前面的文章中我们介绍了Spring AOP的简单使用,并从源码的角度学习了其底层的实现原理,有了这些基础之后,本文来讨论一下Spring AOP失效的问题,这个问题可能我们在平时工作中或多或少也会碰到 ...
随机推荐
-
静态变量static和extern外引用
静态变量--加static关键字的变量,特点: (1)在全局数据区中分配内存,每次对其值得修改都会保留结果,直至程序结束. (2)若静态变量没显示初始化,那会被自动初始化为0,并且只能初始化一遍. 1 ...
-
Sql Server中不常用的表运算符之APPLY(1)
写在这个系列的前面: 就像他们的名字一样,作为一个表运算,他们用来运算左表和右表.JOIN也是一个表运算符,不过他太常用了. APPLY: 将右表表达式应用在左表的每一行上. APPLY是Sql200 ...
-
cocos2d-x 观察者设计模式
1.参考文章 http://blog.csdn.net/vanquishedzxl/article/details/23616535 class HelloWorld : public cocos2 ...
-
JavaScript事件对象【转】
一. 事件对象 事件处理三部分组成:对象.事件处理函数=函数.例如:单击文档任意处. 1.鼠标按钮 非 IE(W3C)中的 button 属性 0 表示主鼠标按钮(常规一般是鼠标左键) 1 表示中间的 ...
-
ip头、tcp头、udp头详解及定义,结合Wireshark抓包看实际情况
公司的同事们在分析网页加载慢的问题,忽然使用到了Wireshark工具,我就像发现新大陆一样好奇,赶紧看了看,顺便复习了一下相关协议.上学时学的忘的差不多了,汗颜啊! 报文封装整体结构 mac帧头定义 ...
-
java.lang.Math中的基本方法
java.lang.Math类提供的方法都是static的,“静态引入 ”使得不必每次在调用类方法时都在方法前写上类名: import static java.lang.Mat ...
-
Ppoj 1014 深搜
这个题题意是给你价值1-6的珠宝个数输出能否平分为两份(如果平分为三分就不知道怎么做了……) 主要是用回溯DFS,但是要剪枝,对200取模……!!(很重要……) 代码…… #include <i ...
-
C/C++基础笔试题1.1.2(十问解决方案运营商)
他写在博客上不负责任,有人踩在上面,原因一点点失去了它. 其实纯常见问题.特别糟糕,由于鲍文看起来很大的优势就是想更直接看到的东西. 好了.返回整个标题. 1.你脑海中的运算符有哪些.按优先级排个序? ...
-
docker初体验,搭建自用的gitlab服务
一.前言 git在如日中天的版本管理系统,现在如果不是工作在git版本管理系统下,几乎都不好意思给人打招呼.现在就有现成的互联网的git服务器提供给大家使用,例如号称程序的社交网络github. 正好 ...
-
如何在centos6.5中安装MySQL数据库
huidaoli 东华理工大学信工IT网-项目1+1学习基地(www.ecit-it.com)