dao层

package com.yaorange.dao;

public interface StudentDao {

public void saveStudent();

public void deleteStudent();
}

dao层的实现

package com.yaorange.dao.impl;

import com.yaorange.dao.StudentDao;

public class StudentDaoImpl implements StudentDao{

@Override
public void saveStudent() {
System.out.println("saveStudent");
}

@Override
public void deleteStudent() {
System.out.println("deleteStudent");
}

}

工具层

第一个是工厂制造studentDao

package com.yaorange.utils;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import com.yaorange.dao.StudentDao;
import com.yaorange.dao.impl.StudentDaoImpl;

public class MyFactory {

public static StudentDao createStudentProxy(){
final StudentDao studentDaoImpl = new StudentDaoImpl();
final StudentAspect studentAspect = new StudentAspect();

StudentDao studentDao = (StudentDao) Proxy.newProxyInstance(MyFactory.class.getClassLoader(),
studentDaoImpl.getClass().getInterfaces(),
new InvocationHandler() {

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
studentAspect.before();
Object object = method.invoke(studentDaoImpl, args);
studentAspect.after();
return object;
}
});
return studentDao;
}
}

StudentAspect是学生的一个aspect

package com.yaorange.utils;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class StudentAspect implements MethodInterceptor{
//开始事务
public void before(){
System.out.println("开始事务");
}

//提交事务
public void after(){
System.out.println("提交事务");
}

@Override
public Object invoke(MethodInvocation mi) throws Throwable {
before();
Object object = mi.proceed();
after();
return object;
}
}

手动的是不写beans.xml的

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
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.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
">
<!--*****************************半自动 **************************** -->
<!--创建目标类 -->
<bean id="studentDaoImpl" class="com.yaorange.dao.impl.StudentDaoImpl"/>

<!--创建切面类 -->
<bean id="studentAspect" class="com.yaorange.utils.StudentAspect"/>

<!-- 3 创建代理类
* 使用工厂bean FactoryBean ,底层调用 getObject() 返回特殊bean
* ProxyFactoryBean 用于创建代理工厂bean,生成特殊代理对象
interfaces : 确定接口们
通过<array>可以设置多个值
只有一个值时,value=""
target : 确定目标类
interceptorNames : 通知 切面类的名称,类型String[],如果设置一个值 value=""
optimize :强制使用cglib
<property name="optimize" value="true"></property>
底层机制
如果目标类有接口,采用jdk动态代理
如果没有接口,采用cglib 字节码增强
如果声明 optimize = true ,无论是否有接口,都采用cglib

-->


<!--代理类 -->
<bean id="proxyStudentDao" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="optimize" value="true"/>
<property name="interfaces" value="com.yaorange.dao.StudentDao"/>
<property name="target" ref="studentDaoImpl"/>
<property name="interceptorNames" value="studentAspect"></property>

</bean>



<!-- **********************全自动 ************************-->
<!-- 目标类 -->
<bean id="studentDaoImpl2" class="com.yaorange.dao.impl.StudentDaoImpl"/>

<!-- *******************切面类************************* -->
<bean id="studentAspect2" class="com.yaorange.utils.StudentAspect"/>
<aop:config>

<!-- *代表匹配   任意包    包里面任意的类   类中任意的方法      .代表方法中的参数 -->

<aop:pointcut expression="excution(* com.yaorange.utils.*.*(..))" id="mypointcut"/>
<aop:advisor advice-ref="studentAspect2" pointcut-ref="mypointcut"/>
</aop:config>
</beans>

最后是我们的测试类

package com.yaorange.test;

import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.yaorange.dao.StudentDao;
import com.yaorange.utils.MyFactory;

public class AOPTest {

//手动
@Test
public void test1(){
StudentDao studentDao = MyFactory.createStudentProxy();
studentDao.saveStudent();
}
//半自动
@Test
public void test2(){
ClassPathXmlApplicationContext cpx = new ClassPathXmlApplicationContext("beans.xml");
StudentDao studentDao = (StudentDao) cpx.getBean("proxyStudentDao");
studentDao.saveStudent();
studentDao.deleteStudent();
}
//全自动
@Test
public void test3(){
StudentDao studentDao = MyFactory.createStudentProxy();
studentDao.saveStudent();
}
}

AOP 手动,半自动,全自动的更多相关文章

  1. 继电器是如何成为CPU的(1)

    继电器是如何成为CPU的(1) ——<穿越计算机的迷雾>整理和总结 究竟是如何设计的电路,具有计算和控制的智力? 这一点也不高深.本系列文章从初中学的最简单的电路图说起,看看能不能从最初的 ...

  2. 继电器是如何成为CPU的

    阅读目录(Content) 从电池.开关和继电器开始 用继电器做个与门 用继电器做个或门 用继电器做个异或门 做一些看起来可用的东西 小小约定 振荡器 加法器 寄存器 R-S触发器 D触发器 上升沿D ...

  3. 继电器是如何成为CPU的(1)【转】

    转自:http://www.cnblogs.com/bitzhuwei/p/from_relay_to_tiny_CPU.html 阅读目录(Content) 从电池.开关和继电器开始 用继电器做个与 ...

  4. 8.AOP全自动

    CGLIB字节码增强 l没有接口,只有实现类. 采用字节码增强框架 cglib,在运行时 创建目标类的子类,从而对目标类进行增强. 导入jar包: 自己导包(了解): 核心:hibernate-dis ...

  5. AOP切面编程

    1.JDK动态代理方式实现 public static UserService createService(){ //目标类 final UserService userService = new U ...

  6. Spring AOP编程(二)-AOP实现的三种方式

    AOP的实现有三种方式: l         aop底层将采用代理机制进行实现. l         接口 + 实现类 :spring采用 jdk 的动态代理Proxy. l         实现类: ...

  7. Spring day02笔记

    spring day01回顾 编写流程(基于xml) 1.导入jar包:4+1 --> beans/core/context/expression | commons-logging 2.编写目 ...

  8. Spring2

    简介:1.Aop编程.2.AspectJ基于xml文件.3.AspectJ基于注解. 4.JdbcTemplate. 5.配置properties文件 1       AOP 1.1   AOP介绍 ...

  9. Spring 框架(二)

    1AOP 1.1 AOP介绍 1.1.1 什么是AOP l 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功 ...

随机推荐

  1. C#之委托

    委托是C#中非常重要的一个概念,并在C#中得到了丰富的应用,如事件,线程等.那什么是委托呢?具体来说,委托是一种引用方法的类型.一旦为委托分配了方法,委托将与该方法具有完全相同的行为.委托方法的使用可 ...

  2. MiniTwitter记住密码等功能实现

    一.SharedPreferences的用法:(相关实现功能的只是了解) 由于SharedPreferences是一个接口,而且在这个接口里没有提供写入数据和读取数据的能力.但它是通过其Editor接 ...

  3. 第十篇.bootstrap轮播

    使用bootstrap的轮播插件可以向站点添加滑块,内容可以是图像,内嵌框架,视频或其它任何内容,使用轮播插件需要引入bootstrap.min.js. <div id="carous ...

  4. cURL入门

    cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.最爽的是,PHP也支持 cURL 库.本文将介绍 cURL 的一些高级特性,以及在PHP中如 ...

  5. 关于css样式1

    背景色 可以使用 background-color 属性为元素设置背景色.这个属性接受任何合法的颜色值. 这条规则把元素的背景设置为灰色: p {background-color: gray;} 如果 ...

  6. 例子:Execution Model Sample - 应用状态保存

    WP中,当你的应用被切换到后台 后,就进入了休眠状态,然后当一个应用从墓碑恢复时,如何恢复相应的状态,该例子就演示了如何保存和恢复UI以及APP相关状态. 这里有一篇很好的文章,请参见: http:/ ...

  7. hbase数据迁移-HDFS拷贝

    1.把数据表test从hbase下拷出 hdfs dfs -get /hbase/data/default/test /home/hadoop/hbase/test 2.文件放到新集群的系统上 scp ...

  8. Bpmx实施经验

    Bpmx是一个较大的平台,直接发布的话会有内存问题,经查阅一些资料,java1.5没有解决好之前版本的历史问题,所以在垃圾处理gc上有很多配置需要手动完成,之后的版本同上. Bpmx平台自带的文档中部 ...

  9. HBase的基本架构及其原理介绍

    1.概述:最近,有一些工程师问我有关HBase的基本架构的问题,其实这个问题仅仅说架构是非常简单,但是需要理解.在这里,我觉得可以用HDFS的架构作为借鉴.(其实像Hadoop生态系统中的大部分组建的 ...

  10. windows上传代码到github

    上传代码到github上有很多种方法,在这里我介绍一种比较简单的一种.工具嘛,越简单越好用啊. 1.首先下载github在windows下的客户端 下载地址:https://desktop.githu ...