Spring AOP (3)
来源:互联网 发布:squid代理 java程序 编辑:程序博客网 时间:2024/06/11 08:10
实现原理:
环绕增强完成功能:在目标类的方法执行前后嵌入增强逻辑.
实现原理:
1. 实现接口 MethodInterceptor,重写函数 invoke ,在函数 invoke 前后实现需要插入目标方法之后的逻辑代码
2. 利用ProxyFactoryBean代理类调用目标类方法
3.配置Spring XML
定义接口类
package com.advice;import com.smart.domain.User;import java.sql.SQLException;/** * @author Duoduo * @version 1.0 * @date 2017/4/22 18:58 */public interface IUserDao { int addUser(User user); int updateUser(User user); void deleteUser(User user); void removeUser(User user) throws SQLException;}
接口实现类
package com.advice;import com.smart.domain.User;import java.sql.SQLException;/** * @author Duoduo * @version 1.0 * @date 2017/4/22 19:00 */public class UserDaoImpl implements IUserDao { @Override public int addUser(User user) { System.out.println("Add user"); return 0; } @Override public int updateUser(User user) { System.out.println("Update user"); return 0; } @Override public void deleteUser(User user) { //throw new RuntimeException("exception test"); } @Override public void removeUser(User user) throws SQLException { //throw new SQLException("SQLException Test"); }}
定义环绕增强类
package com.advice;import com.smart.domain.User;import org.aopalliance.intercept.MethodInterceptor;import org.aopalliance.intercept.MethodInvocation;/** * 环绕增强: 在目标类的方法前后嵌入增强逻辑 * @author Duoduo * @version 1.0 * @date 2017/4/23 09:59 */public class AddUserInterceptor implements MethodInterceptor { @Override public Object invoke(MethodInvocation invocation) throws Throwable { //获取参数 Object[] args = invocation.getArguments(); User user = (User)args[0]; //在目标类执行方法之前执行 ... System.out.println("AddUserInterceptor before execute add user"); //执行目标类的方法 Object object = invocation.proceed(); //在目标类执行方法之后执行 ... System.out.println("AddUserInterceptor after execute add user"); return object; }}
Spring XML 配置
特别注意:代理工厂是 ProxyFactoryBean 不是 ProxyFactory
<!-- 代理设置 --><bean id="userDaoImpl" class="com.advice.UserDaoImpl"/><bean id="addUserBeforAdvice" class="com.advice.AddUserBeforAdvice"/><bean id="addUserAfterAdvice" class="com.advice.AddUserAfterAdvice"/><bean id="addUserInterceptor" class="com.advice.AddUserInterceptor"/><bean id="addUserProxyFactory" class="org.springframework.aop.framework.ProxyFactoryBean" p:proxyInterfaces="com.advice.IUserDao" p:target-ref="userDaoImpl" p:interceptorNames="addUserInterceptor"/>
两种调用方式:
1.根据XML配置来进行调用测试
2.自己创建代理来进行测试
另种方法都需要注意:此处代理获取的是代理Bean,指向的是Interface的代理。
@Testpublic void addUserInterceptorTest(){ System.out.println("************ addUserInterceptorTest ************"); /*IUserDao userDao = new UserDaoImpl(); MethodInterceptor interceptor = new AddUserInterceptor(); //创建代理工厂 ProxyFactory proxyFactory = new ProxyFactory(); //设置代理目标类 proxyFactory.setTarget(userDao); //为代理添加增强 proxyFactory.addAdvice(interceptor); //生成代理实例 IUserDao proxyUserDao = (IUserDao)proxyFactory.getProxy(); proxyUserDao.addUser(user);*/ ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-another-context.xml"); //代理为指向Interface的代理 IUserDao userDaoProxyFactory = (IUserDao) context.getBean("addUserProxyFactory"); userDaoProxyFactory.addUser(user);}
测试结果
四月 23, 2017 3:43:28 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@d4342c2: startup date [Sun Apr 23 15:43:28 CST 2017]; root of context hierarchy四月 23, 2017 3:43:28 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions信息: Loading XML bean definitions from class path resource [spring-another-context.xml]AddUserInterceptor before execute add userAdd userAddUserInterceptor after execute add user
0 0
- spring AOP(3)
- spring基础知识3:aop
- spring学习-3-AOP
- Spring AOP (3)
- Spring AOP(3)
- Spring基础-3-AOP
- Spring 3 AOP 0 AOP基础
- Spring 3 AOP 1 简单AOP
- Spring 3 AOP实现方式
- Spring技术(3)AOP
- Spring 3 AOP 概念介绍
- Spring 3 AOP 概念介绍
- Spring总结3—AOP
- 【spring 3】AOP:静态代理
- Spring学习笔记3-AOP
- Spring Aop 初探(3)
- spring-3-xml配置AOP
- spring-6-aop-3-cglib
- 函数的数据传递
- Java的命名规范
- 10岁儿童的文章之树莓派2起程之旅——硬件破解之为你点亮心目中的小灯泡(一)
- UML用例图总结
- [SDOI2017]树点涂色
- Spring AOP (3)
- 宅急送 项目第四天 取派员和区域管理
- 浅谈拒绝服务攻击的原理与防御(2):反射型DDOS
- 红黑树(RBTree)
- Java程序员必读之热门书单
- 正则笔记
- 机器学习—模型评估与选择
- JLOI2017——相逢是问候,离别是祝愿
- 怎么样在C++模板类编写类成员cleanup的部分