设计模式(四) 手动实现AOP代理
1.事务的使用:
每次对数据库操作我们都需要开启事务,事务开启后,我们就需要对数据库进行一次或者多次操作,当操作完成后就需要提交事务。比如一个业务中多次操作数据库,但是当某个方法出错的时候,我们需要整体回滚,
所以我们把业务的操作绑定在一个事务中。)
2.手动实现aop管理事务
我们都知道,如果在业务流程代码中增加事务的开启与提交操作,那么我们在一个类中维护的将会是业务与事务的代码。代码少还可以,但是如果代码量很大,维护起来将显得臃肿复杂。那么我们能不能将业务与事务的代码剥离开来,分开进行维护呢?
答案肯定是可行的。下面我们通过手动实现AOP代理。
AOP 面向切面的编程:
AOP可以实现“业务代码”与“关注点代码”分离,关注点代码可以想象为事务的那部分代码。
代码示例:
IUserDao 接口对象
package com.murong.aop; //接口
public interface IUserDao
{
void save();
}
UserDao 目标对象
package com.murong.aop; import org.springframework.stereotype.Component; /**
* 目标对象
*/
@Component // 加入IOC容器
public class UserDao implements IUserDao
{
@Override
public void save()
{
System.out.println("-----核心业务:保存!!!------");
}
}
Aop 关注点代码类
package com.murong.aop; import org.springframework.stereotype.Component; /**
* 关注点代码类
*/
@Component // 加入IOC容器
public class Aop
{
// 重复执行的代码
public void begin()
{
System.out.println("事务开启");
} // 重复执行的代码
public void end()
{
System.out.println("事务结束");
}
}
ProxyFactory 代理工厂
package com.murong.aop; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; /**
* 代理工厂 *
*/
public class ProxyFactory
{
public static Object newProxyInstance(final Object target,final Aop aop)
{
// 生成代理对象的方法
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler()
{ @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
aop.begin();// 关注点代码
Object result = method.invoke(target, args);// 执行目标对象的方法
aop.end();// 关注点代码
return result;
}
});
}
}
applicationContext 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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"
default-autowire="byType"> <!-- 开启注解扫描 -->
<context:component-scan base-package="com.murong.aop"></context:component-scan>
<!-- 调用工厂方法,返回UserDao的代理对象 -->
<bean id="userDao_proxy" class="com.murong.aop.ProxyFactory" factory-method="newProxyInstance">
<constructor-arg index="0" type="java.lang.Object" ref="userDao"></constructor-arg>
<constructor-arg index="1" type="com.murong.aop.Aop" ref="aop"></constructor-arg>
</bean>
</beans>
App 测试类
package com.murong.aop; import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class App
{
private ApplicationContext ac = new ClassPathXmlApplicationContext("com/murong/aop/applicationContext");
@Test
public void test()
{
IUserDao dao = (IUserDao) ac.getBean("userDao_proxy");
dao.save();
}
}
结果:

分析总结:
关注点代码,就是指重复执行的代码。
业务代码与关注点代码分离,好处?
-à 关注点代码写一次即可;
-à开发者只需要关注核心业务;
-à运行时期,执行核心业务代码时候动态植入关注点代码; 【代理】
设计模式(四) 手动实现AOP代理的更多相关文章
- JavaEE中的MVC(四)AOP代理
咱们来吹牛,JDK的动态代理在AOP(Aspect Oriented Programming,面向切面编程)中被称为AOP代理,而AOP是Spring框架中的重要组成部分. 代理模式 但是什么是代理模 ...
- 【白话设计模式四】单例模式(Singleton)
转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...
- Spring第五篇【cglib、手动实现AOP编程】
前言 到目前为止,已经简单学习了Spring的Core模块.也会怎么与Struts2框架进行整合了-.于是我们就开启了Spring的AOP模块了-在讲解AOP模块之前,首先我们来讲解一下cglib代理 ...
- Spring系列(四):Spring AOP详解和实现方式(xml配置和注解配置)
参考文章:http://www.cnblogs.com/hongwz/p/5764917.html 一.什么是AOP AOP(Aspect Oriented Programming),即面向切面编程, ...
- 8 -- 深入使用Spring -- 4...5 AOP代理:基于注解的“零配置”方式
8.4.5 基于注解的“零配置”方式 AspectJ允许使用注解定义切面.切入点和增强处理,而Spring框架则可识别并根据这些注解来生成AOP代理.Spring只是使用了和AspectJ 5 一样的 ...
- Spring学习13-中IOC(工厂模式)和AOP(代理模式)的详细解释
我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式. IOC是工厂模式参考:设计模式- ...
- 手动实现aop编程
手动实现aop编程(运用代理模式实现) aop:aspect object programming 功能:让关注点与业务代码分离 关注点:重复代码就叫做关注点 切面:关注点形成的类,就叫切面(类) 面 ...
- spring5 源码深度解析----- AOP代理的生成
在获取了所有对应bean的增强后,便可以进行代理的创建了.回到AbstractAutoProxyCreator的wrapIfNecessary方法中,如下所示: protected static fi ...
- java设计模式(一)动态代理模式,JDK与CGLIB分析
-本想着这个知识点放到Spring Aop说说可能更合适一点,但因为上一篇有所提到就简单分析下,不足之处请多多评论留言,相互学习,有所提高才是关键! 什么是代理模式: 记得有本24种设计模式的书讲到代 ...
随机推荐
- grep检索文本
grep [OPTIONS] PATTERN [FILE...] grep zifuchuan * 不行的话来一个: grep zifuchuan */* 不行的话再来一个: grep zifuc ...
- sudo -E的意思
1.sudo -E -E选项在man page中的解释是: -E The -E (preserve environment) option indicates to the security poli ...
- 基础-Eclipse 教程
1.Eclipse 是一个开放源代码的.基于 Java 的可扩展开发平台.2.下载地址为: https://www.eclipse.org/downloads/.3.Eclipse 修改字符集 : W ...
- c++新特性---引用变量
一.定义 引用变量是已定义变量的别名,如将ra设置为a的引用变量,则可以使用ra和a交替使用该变量. 表示: int a = 5; int & ra = a; 其中&不是地址运算符,而 ...
- 简述synchronized和java.util.concurrent.locks.Lock异同
主要相同点:Lock能完成synchronized所实现的所有功能.主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.syncronized会自动释放锁,而Lock一定要程 ...
- android实现解析webservices
package com.example.ksoap2demo; import java.io.UnsupportedEncodingException; import org.ksoap2.SoapE ...
- python 的时间复杂度
Python内置方法的时间复杂度 本文翻译自Python Wiki 本文基于GPL v2协议,转载请保留此协议. 本页面涵盖了Python中若干方法的时间复杂度(或者叫“大欧”,“Big O”).该时 ...
- dubbo框架的介绍,应用
http://www.cnblogs.com/Javame/p/3632473.html
- CentOS下搭建LNMP+WordPress+http2.0教程
此文是本人CentOS下搭建WordPress的一些笔记,环境搭建时间::将看过的几篇文章总结下来,形成一条龙长文.不用大家再找来找去. 本文大概分为此几部分: 一.基础命令更新: 二.服务器加速(非 ...
- [Go语言]从Docker源码学习Go——结构和函数的定义
Docker在最近很火,而作为Docker的开发语言-Go也再次被大家提到. 已经使用Docker一段时间了,但是对于源码,尤其是其开发语言Go却一直是一知半解. 最近准备利用空余时间从Docker源 ...