设计模式(四) 手动实现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种设计模式的书讲到代 ...
随机推荐
- java 利用同步工具类控制线程
前言 参考来源:<java并发编程实战> 同步工具类:根据工具类的自身状态来协调线程的控制流.通过同步工具类,来协调线程之间的行为. 可见性:在多线程环境下,当某个属性被其他线程修改后,其 ...
- easy ui 验证框的使用
Easy ui 插件之validatebox missingMessage:未填写时显示的信息validType:验证类型见下示例invalidMessage:无效的数据类型时显示的信息require ...
- 【BZOJ】2019: [Usaco2009 Nov]找工作(spfa)
http://www.lydsy.com/JudgeOnline/problem.php?id=2019 spfa裸题.....将飞机场的费用变成负,然后spfa找正环就行了 #include < ...
- 对Linux命令进一步学习vim(二)
今天,进一步学习Linux相关的命令,可能会有重复的地方,但学习本来就是不断重复的过程.故作小记! 1.安装了:vim ,,,一款Linux爱好者经常用到的ide sudo apt-get inst ...
- 如何用MathType编辑这三个符号
MathType是一款专门的公式编辑器,用来编辑数学物理等公式,很多期刊杂志的排版都会用到它.用MathType编辑公式的时候,完全不用考虑学习和上手的过程,打开就可以编辑出你的公式,所以这个工具对于 ...
- 怎样使用Intent传递对象
怎样使用Intent传递对象 我们能够使用Intent来启动Activity.开启服务Service,发送广播Broadcast,然后使用Intent传递主要的数据类型,如:布尔值,整型,字符串等 I ...
- cocos2d安卓自动编译脚本去掉复制Resources资源和签名功能
去掉这两个功能的原因: 1.因为有时候打包是分渠道的,不同的渠道资源也可能不一样,所以不能直接复制资源. 2.如果用cocostudio打release包,因为要输入签名地址,会导致在自动签名处停住不 ...
- 1、Android自己的下拉刷新SwipeRefreshLayout
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/ ...
- mac上的webStorm上配置gitHub
一,webStorm下,首先打开Preferences; 二,在Version Control目录下,选择GitHub,填写有边的内容; 注意:填写完Login和Password的以后,点击Test一 ...
- ssh框架搭建出现的问题和解决
[说明]今天尝试从头开始搭建ssh 框架, 真心是有点不太容易,可能是第一次吧,之前都是小打小闹. 一:今日完成 搭建 Spring 环境 --> 然后搭建 Hibernate 环境 --> ...