Spring--AOP--面向切面编程
AOP: 面向切面编程. 通过动态代理实现.
AOP就3条线, 2条线给剪断.
实现:动态代理
如果实现interface的话, 用Proxy, InvocationHandler.
不实现interface的话, 用cglib操作二进制码实现.
AOP用在哪里:
性能, 日志, 权限检查, transaction.
项目里如何使用: 声明式事务管理.
JDK提供了两个提供动态代理的类: Proxy, InvocationHandler.
UserServiceTest.java:
- package com.bjsxt.service;
- import java.lang.reflect.Proxy;
- import org.junit.Test;
- import com.bjsxt.aop.LogInterceptor;
- import com.bjsxt.dao.UserDAO;
- import com.bjsxt.dao.impl.UserDAOImpl;
- import com.bjsxt.model.User;
- import com.bjsxt.spring.BeanFactory;
- import com.bjsxt.spring.ClassPathXmlApplicationContext;
- public class UserServiceTest {
- @Test
- public void testProxy() {
- UserDAO userDAO = new UserDAOImpl();
- LogInterceptor li = new LogInterceptor();
- li.setTarget(userDAO);
- UserDAO userDAOProxy = (UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), userDAO.getClass().getInterfaces(), li);
- System.out.println(userDAOProxy.getClass());
- userDAOProxy.delete();
- userDAOProxy.save(new User());
- }
- }
代理 LogInterceptor.java:
- package com.bjsxt.aop;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- public class LogInterceptor implements InvocationHandler {
- private Object target;
- public Object getTarget() {
- return target;
- }
- public void setTarget(Object target) {
- this.target = target;
- }
- public void beforeMethod(Method m) {
- System.out.println(m.getName() + " start");
- }
- public Object invoke(Object proxy, Method m, Object[] args)
- throws Throwable {
- beforeMethod(m);
- m.invoke(target, args);
- return null;
- }
- }
UserDAOImpl.java:
- package com.bjsxt.dao.impl;
- import com.bjsxt.dao.UserDAO;
- import com.bjsxt.model.User;
- public class UserDAOImpl implements UserDAO {
- public void save(User user) {
- System.out.println("user saved!");
- }
- public void delete() {
- System.out.println("user deteleted");
- }
- }
UserDAO.java:
- package com.bjsxt.dao;
- import com.bjsxt.model.User;
- public interface UserDAO {
- public void save(User user);
- public void delete();
- }
Spring--AOP--面向切面编程的更多相关文章
- 详细解读 Spring AOP 面向切面编程(二)
本文是<详细解读 Spring AOP 面向切面编程(一)>的续集. 在上篇中,我们从写死代码,到使用代理:从编程式 Spring AOP 到声明式 Spring AOP.一切都朝着简单实 ...
- 浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~
简介 我们都知道,Spring 框架作为后端主流框架之一,最有特点的三部分就是IOC控制反转.依赖注入.以及AOP切面.当然AOP作为一个Spring 的重要组成模块,当然IOC是不依赖于Spring ...
- spring AOP面向切面编程学习笔记
一.面向切面编程简介: 在调用某些类的方法时,要在方法执行前或后进行预处理或后处理:预处理或后处理的操作被封装在另一个类中.如图中,UserService类在执行addUser()或updateUse ...
- 【Spring系列】Spring AOP面向切面编程
前言 接上一篇文章,在上午中使用了切面做防重复控制,本文着重介绍切面AOP. 在开发中,有一些功能行为是通用的,比如.日志管理.安全和事务,它们有一个共同点就是分布于应用中的多处,这种功能被称为横切关 ...
- 从源码入手,一文带你读懂Spring AOP面向切面编程
之前<零基础带你看Spring源码--IOC控制反转>详细讲了Spring容器的初始化和加载的原理,后面<你真的完全了解Java动态代理吗?看这篇就够了>介绍了下JDK的动态代 ...
- Spring AOP面向切面编程详解
前言 AOP即面向切面编程,是一种编程思想,OOP的延续.在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等等.在阅读本文前希望您已经对Spring有一定的了解 注:在能对代码进行添 ...
- Spring AOP 面向切面编程相关注解
Aspect Oriented Programming 面向切面编程 在Spring中使用这些面向切面相关的注解可以结合使用aspectJ,aspectJ是专门搞动态代理技术的,所以比较专业. ...
- Spring AOP 面向切面编程入门
什么是AOP AOP(Aspect Oriented Programming),即面向切面编程.众所周知,OOP(面向对象编程)通过的是继承.封装和多态等概念来建立一种对象层次结构,用于模拟公共行为的 ...
- 详细解读 Spring AOP 面向切面编程(一)
又是一个周末, 今天我要和大家分享的是 AOP(Aspect-Oriented Programming)这个东西,名字与 OOP 仅差一个字母,其实它是对 OOP 编程方式的一种补充,并非是取而代之. ...
- Spring Aop面向切面编程&&自动注入
1.面向切面编程 在程序原有纵向执行流程中,针对某一个或某一些方法添加通知,形成横切面的过程叫做面向切面编程 2.常用概念 原有功能:切点,pointcut 前置通知:在切点之前执行的功能,befor ...
随机推荐
- asp.net textbox控件readonly为true时,后台取值的问题
如题,在后台通过textbox.Text方式取值为空,不论你默认值是否是空,如想要获得,需通过request.Form[""]的方式.
- linux c中select使用技巧
1.select函数作为定时器使用 it_value.tv_sec = 0; it_value.tv_usec = 100000: select(1,NULL,NULL,NULL,& ...
- URL的# (转)
http://www.ruanyifeng.com/blog/2011/03/url_hash.html
- php并发控制 , 乐观锁
由于悲观锁在开始读取时即开始锁定,因此在并发访问较大的情况下性能会变差.对MySQL Inodb来说,通过指定明确主键方式查找数据会单行锁定,而查询范围操作或者非主键操作将会锁表. 接下来,我们看一下 ...
- 门面模式(Facade)解析
门面模式使用一个门面类来包装一些复杂的类,对外提供一个简单的访问方法. 见如下代码: class CPU { public void startup() { System.out.println(&q ...
- 为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序
在Android硬件抽象层(HAL)概要介绍和学习计划一文中,我们简要介绍了在Android系统为为硬件编写驱动程序的方法.简单来说,硬件驱动程序一方面分布在Linux内核中,另一方面分布在用户空间的 ...
- JS-DOM元素灵活查找
用className选择元素 封装成函数 <title>无标题文档</title> <script> /* window.onload=function () { ...
- 转:LoadRunner检查点使用小结
LR中检查点有两种:图片和文字. 常用检查点函数如下: 1)web_find()函数用于从 HTML 页中搜索指定的文本字符串: 2)web_reg_find()函数注册一个请求,以在下一个操作函数( ...
- PAT (Advanced Level) 1102. Invert a Binary Tree (25)
简单题. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #in ...
- (转)Windows管道(Pipe)重定向stdout,stderr,stdin
参考: http://qiusuoge.com/11496.html http://www.cnblogs.com/BoyXiao/archive/2011/01/01/1923828.html st ...