Java进阶知识21 Spring的AOP编程
1、概述
Aop:(Aspect Oriented Programming)面向切面编程
功能: 让关注点代码与业务代码分离!
关注点:重复代码就叫做关注点;
切面: 关注点形成的类,就叫切面(类)!
面向切面编程,就是指对很多功能都有的重复的代码抽取,再在运行的时候往业务方法上动态植入“切面类代码”。
切入点:执行目标对象方法,动态植入切面代码。
可以通过切入点表达式,指定拦截哪些类的哪些方法;给指定的类在运行的时候植入切面类代码。
2、XML方式实现AOP编程
2.1、我用到的jar包
这些Spring包 不一定每个都使用到
2.2、简单实例演示1(需要实现接口,相当于动态代理)Spring的动态代理:https://www.cnblogs.com/dshore123/p/11753623.html
IUserDao 接口类
package com.shore.dao; /**
* @author DSHORE/2019-11-7
*
*/
public interface IUserDao {
public void save();
}
UserDao 接口的实现类
package com.shore.dao.impl; import com.shore.dao.IUserDao; /**
* @author DSHORE/2019-11-7
*
*/
public class UserDao implements IUserDao { @Override
public void save() { //3、执行业务方法
System.out.println("3、保存用户成功!");
}
}
Aop 类(程序执行到某一业务时,先去执行指定逻辑代码)
package com.shore.aop; import org.aspectj.lang.ProceedingJoinPoint; /**
* @author DSHORE/2019-11-7
*
*/
public class Aop {
//around:环绕; ProceedingJoinPoint:必须添加(执行)
@SuppressWarnings("unused")
private void around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("2、环绕前....");
pjp.proceed(); // 执行目标方法(业务代码)
System.out.println("5、环绕后....");
} public void begin() {
System.out.println("1、开启事务......");
} public void commit() {
System.out.println("6、提交事务......");
} public void afterReturning() {
System.out.println("4、afterReturning(),返回消息");
} //有异常,执行这个第四步;没有异常,则执行上面的第四步
public void afterThrowing(){
System.out.println("4、afterThrowing(),返回异常消息");
}
}
Spring 配置文件(beans.xml) 切入点表达式:https://www.cnblogs.com/dshore123/p/11823849.html
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- dao类 -->
<bean id="userDao" class="com.shore.dao.impl.UserDao"></bean>
<!-- 注入切面类 -->
<bean id="aop" class="com.shore.aop.Aop"></bean> <aop:config>
<!-- 配置切入点 -->
<aop:pointcut expression="execution(* com.shore.dao.impl.*.*(..))" id="pt" />
<!-- 配置切面(切入点形成的类,切入点就是重复的代码/方法) -->
<aop:aspect ref="aop">
<!-- 1、开启事务。。。。。。 -->
<aop:before method="begin" pointcut-ref="pt" />
<!-- 6、提交事务 -->
<aop:after method="commit" pointcut-ref="pt" />
<!-- 环绕2/5 -->
<aop:around method="around" pointcut-ref="pt" />
<!-- 4、afterReturning -->
<aop:after-returning method="afterReturning"
pointcut-ref="pt" />
<!-- 4、异常(程序出现异常,执行这个第四步;没有异常,则执行上面的第四步) -->
<aop:after-throwing method="afterThrowing"
pointcut-ref="pt" />
</aop:aspect>
</aop:config>
</beans>
测试类
package com.shore.test; import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.shore.dao.IUserDao; /**
* @author DSHORE/2019-11-7
*
*/
public class MyTest {
@Test
public void testUserDao() {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
IUserDao userDao = (IUserDao) context.getBean("userDao");
//$Proxy4 :class com.sun.proxy.$Proxy4
System.out.println("这个相当于动态代理$Proxy4:"+userDao); //返回值:com.shore.dao.impl.UserDao@73aecc3a
userDao.save();
}
}
测试结果图
2.3、简单实例演示2(不需要实现接口,相当于Cglib子类代理) Spring的Cglib子类代理:https://www.cnblogs.com/dshore123/p/11753623.html
MessageDao 类(没有实现接口)
package com.shore.dao.impl; /**
* @author DSHORE/2019-11-7
*
*/
public class MessageDao {
public void save() { //3、执行业务方法
System.out.println("3、保存信息成功!");
}
}
Aop 类(和上面2.2中的一样,不变)
package com.shore.aop; import org.aspectj.lang.ProceedingJoinPoint; /**
* @author DSHORE/2019-11-7
*
*/
public class Aop {
//around:环绕; ProceedingJoinPoint:必须添加(执行)
@SuppressWarnings("unused")
private void around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("2、环绕前....");
pjp.proceed(); // 执行目标方法(业务代码)
System.out.println("5、环绕后....");
} public void begin() {
System.out.println("1、开启事务......");
} public void commit() {
System.out.println("6、提交事务......");
} public void afterReturning() {
System.out.println("4、afterReturning(),返回消息");
} //有异常,执行这个第四步;没有异常,则执行上面的第四步
public void afterThrowing(){
System.out.println("4、afterThrowing(),返回异常消息");
}
}
Spring 配置文件(beans.xml)
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- dao类 -->
<!-- <bean id="userDao" class="com.shore.dao.impl.UserDao"></bean> -->
<bean id="messageDao" class="com.shore.dao.impl.MessageDao"></bean>
<!-- 注入切面类 -->
<bean id="aop" class="com.shore.aop.Aop"></bean> <aop:config>
<!-- 配置切入点 -->
<aop:pointcut expression="execution(* com.shore.dao.impl.*.*(..))" id="pt" />
<!-- 配置切面(切入点形成的类,切入点就是重复的代码/方法) -->
<aop:aspect ref="aop">
<!-- 1、开启事务。。。。。。 -->
<aop:before method="begin" pointcut-ref="pt" />
<!-- 6、提交事务 -->
<aop:after method="commit" pointcut-ref="pt" />
<!-- 环绕2/5 -->
<aop:around method="around" pointcut-ref="pt" />
<!-- 4、afterReturning -->
<aop:after-returning method="afterReturning"
pointcut-ref="pt" />
<!-- 4、异常(程序出现异常,执行这个第四步;没有异常,则执行上面的第四步) -->
<aop:after-throwing method="afterThrowing"
pointcut-ref="pt" />
</aop:aspect>
</aop:config>
</beans>
测试类
@Test
public void testMessageDao() {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
MessageDao messageDao = (MessageDao) context.getBean("messageDao");
System.out.println("这个相当于Cglib子类代理:"+messageDao);//返回值:com.shore.dao.impl.MessageDao@15412e75
messageDao.save();
}
测试结果图
原创作者:DSHORE 作者主页:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnblogs.com/dshore123/p/11813822.html 欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!) |
Java进阶知识21 Spring的AOP编程的更多相关文章
- Java基础-SSM之Spring的AOP编程
Java基础-SSM之Spring的AOP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Spring的本质说白了就是动态代理,接下来我们会体验AOP的用法.它是对OOP的 ...
- Java进阶知识15 Spring的基础配置详解
1.SSH各个的职责 Struts2:是web框架(管理jsp.action.actionform等).Hibernate:是ORM框架,处于持久层.Spring:是一个容器框架,用于配置bean,并 ...
- Java进阶知识25 Spring与Hibernate整合到一起
1.概述 1.1.Spring与Hibernate整合关键点 1) Hibernate的SessionFactory对象交给Spring创建. 2) hibernate事务交给spring的声明 ...
- Java进阶知识24 Spring的事务管理(事务回滚)
1.事务控制概述 1.1.编程式事务控制 自己手动控制事务,就叫做编程式事务控制. Jdbc代码: connection.setAutoCommit(false); ...
- Java进阶知识23 Spring对JDBC的支持
1.最主要的代码 Spring 配置文件(beans.xml) <!-- 连接池 --> <bean id="dataSource" class="co ...
- Java进阶知识20 Spring的代理模式
本文知识点(目录): 1.概念 2.代理模式 2.1.静态代理 2.2.动态代理 2.3.Cglib子类代理 1.概念 1.工厂模式 2. 单例模式 代理(Proxy ...
- Java进阶知识17 Spring Bean对象的创建细节和创建方式
本文知识点(目录): 1.创建细节 1) 对象创建: 单例/多例 2) 什么时候创建? 3)是否延迟创建(懒加载) 4) 创建对象之后, ...
- Java进阶知识22 Spring execution 切入点表达式
1.概述 切入点(execution ):可以对指定的方法进行拦截,从而给指定的类生成代理对象.(拦截谁,就是在谁那里切入指定的程序/方法) 格式: execution(modifiers-pat ...
- Java进阶知识18 Spring对象依赖关系的几种写法
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
随机推荐
- go if 便捷语句
之前使用java C#没这么用过. 绝对新技能 if v := math.Pow(x, n); v < lim { 跟 for 一样,`if` 语句可以在条件之前执行一个简单的语句. 由这个语 ...
- 『Python基础练习题』day02
1.判断下列逻辑语句的True, False 1) 1 > 1 or 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < 6 2) ...
- Unity插件研究-EasyTouch V5
抽空研究了下Easy Touch 5插件,发现确实很好用,下面是相应的用法: 1. Easy Touch Controls:实现虚拟摇杆的组件 在项目的"Hierarchy"窗口下 ...
- MySql外网不能访问设置
mysql的root账户,我在连接时通常用的是localhost或127.0.0.1,公司的测试服务器上的mysql也是localhost所以我想访问无法访问,测试暂停. 解决方法如下: 1,修改表, ...
- Node初始以及环境搭建(Node01)
1. 相关概念 •什么是JavaScript? •一种遵守ECMAScript标准的脚本语言 •最初只能运行在浏览器端 •浏览器中的 JavaScript 可以做什么? •操作DOM:表单验证.动画 ...
- sql过程的条件是IN,用脚本执行
DECLARE @sql nvarchar(); DECLARE @inStr nvarchar(); SET @inStr='''条件1'',''条件2'''; set @sql='SELECT * ...
- CUDA 笔记
名词解释 SM :Streaming Multiprocessor 而 Block 大致就是对应到 SM 所有的blocks 按照流水线被送到6个SM中进行计算 在 Compute Ca ...
- printPreviewControl1怎么刷新文档
printPreviewControl1.InvalidatePreview(); 调用printPreviewControl1控件的 InvalidatePreview() 这个方法即可.
- 如何把SAP WebIDE里的Web项目同Github仓库连接起来
我们在SAP WebIDE里进行UI5应用开发时,当然也希望能将开发的代码纳入到github版本管理中去. 步骤其实非常简单. 右键点击WebIDE里UI5应用,git->Initialize ...
- flask的配置项及获取
1 修改/新增配置项的3种方法 # 配置参数的使用方式 # 1. 使用配置文件 # app.config.from_pyfile("config.cfg") # 2. 使用对象配置 ...