AOP 手动,半自动,全自动

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();
}
}

时间: 2024-10-22 19:38:07

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

继电器是如何成为CPU的

阅读目录(Content) 从电池.开关和继电器开始 用继电器做个与门 用继电器做个或门 用继电器做个异或门 做一些看起来可用的东西 小小约定 振荡器 加法器 寄存器 R-S触发器 D触发器 上升沿D触发器 乒乓触发器 走马灯 寄存器 中场休息 自言自语 继电器是如何成为CPU的(1) --<穿越计算机的迷雾>整理和总结 究竟是如何设计的电路,具有计算和控制的智力? 这一点也不高深.本系列文章从初中学的最简单的电路图说起,看看能不能从最初的有一个继电器的电路,画到一个简单的CPU.电路图用mu

黄金十年(一)

前言: 从学校毕业有半年了,这半年是我个人相对动荡的一年,也是我迈向社会的第一年,在经历了许许多多的事情之后,决定写一个系列的记录文章,来记录下作为新时代中国一个普通青年的人生抉择与作为普通大学毕业生在职场中的感悟,感触.以通就社会之变,明晰生存之道. 大学,这是一个人生的分水岭,当你一踏进它的大门,便会豁然明白,你已经从孩子变成了大人,青春岁月开始了,这是你的黄金年华,连空气都像美酒一般醇美醉人.——<平凡的世界> 2016年入学,2019年毕业,大学两年的时间一晃而过,其中的是是非非也不想

Spring(二)面向切面编程AOP

这篇博客写的比较累赘,好多相同的程序写了好几遍,主要是为了是自己养成这样的一个编程思路,其中应该不乏错误之处,以后好好学,慢慢改吧.------jgp 1 AOP介绍 1.1什么是AOP 面向切面编程(Aspect Oriented Programing):通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. AOP采取横向抽取机制,取代了传统纵向继承体系的重复性代码,主要体现在事务处理.日志管理.权限控制.异常处理等方面,使开发人员在编写业务逻辑时可以专心于核心业务,提高了代码的可

Spring2

简介:1.Aop编程.2.AspectJ基于xml文件.3.AspectJ基于注解. 4.JdbcTemplate. 5.配置properties文件 1       AOP 1.1   AOP介绍 1.1.1   什么是AOP l  在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行 期动态代理实现程序功能的统一维护的一种技术.AOP是OOP(面向对象编程)的延续,是软件开发中的 一个热点,也是Spring框架中的一个重要内

Spring day02笔记

spring day01回顾 编写流程(基于xml) 1.导入jar包:4+1 --> beans/core/context/expression | commons-logging 2.编写目标类:dao和service 3.spring配置文件 IoC:<bean id="" class="" > DI:<bean> <property name="" value="" | ref=&q

spring_2

1 spring day01回顾 1.1 编写流程(基于xml) 1.导入jar包:4+1  --> beans/core/context/expression  | commons-logging 2.编写目标类:dao和service 3.spring配置文件 IoC:<bean id="" class="" > DI:<bean> <property name="" value=""

SMT实用工艺

SMT实用工艺基础 第一章 SMT概述 SMT(表面组装技术)是新一代电子组装技术.经过20世纪80年代和90年代的迅速发展,已进入成熟期.SMT已经成为一个涉及面广,内容丰富,跨多学科的综合性高新技术.最新几年,SMT又进入一个新的发展高潮,已经成为电子组装技术的主流. 1.1SMT概述 SMT是无需对印制板钻插装孔,直接将处式元器件或适合于表面组装的微型元件器贴.焊到印制或其他基板表面规定位置上的装联技术. 由于各种片式元器件的几何尺寸和占空间体积比插装元器件小得多,这种组装形式具有结构紧凑

深度学习模型超参数搜索实用指南

要知道,与机器学习模型不同,深度学习模型里面充满了各种超参数.而且,并非所有参数变量都能对模型的学习过程产生同样的贡献. 考虑到这种额外的复杂性,在一个多维空间中找到这些参数变量的最佳配置并不是件容易的事情. 每一位科学家和研究人员,都希望在现有的资源条件下(计算.金钱和时间),找到最佳的模型. 通常情况下,研究人员和业余爱好者会在开发的最后阶段尝试一种搜索策略.这可能会有助改进他们辛辛苦训练出来的模型. 此外,在半自动/全自动深度学习过程中,超参数搜索也是的一个非常重要的阶段. 超参数到底是什

RFID 电动二轮自行车的防盗系统—读头

RFID 电动二轮自行车的防盗系统-读头 在RFID电动自行车防盗系统中,2.4G的读头占有重要环节:关系到读标签跟将ID号传输到后台,在这里介绍一款2.4G RFID系统中无线链路的RFID收发芯片-SI24R1芯片. 现在介绍一下这款芯片的基本知识: Si24R1是一颗工作在2.4GHz ISM频段,专为低功耗无线场合设计,集成嵌入式ARQ基带协议引擎的无线收发器芯片.工作频率范围为2400MHz-2525MHz,共有126个1MHz带宽的信道. Si24R1采用GFSK/FSK数字调制与解