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 ...
随机推荐
- SAS学习笔记11 SAS宏
宏是一个被储存的文本,用一个名字识别它.最简单的宏就像一个宏变量一样工作,但复杂的宏可以完成许多宏变量不能做的事. 定义宏的语句格式为: %macro 宏名称: 宏文本 %mend <宏名称&g ...
- shell习题第25题:判断是否开启web服务
[题目要求] 写一个脚本判断我的linux服务器是否开启web服务?监听80端口 [核心要点] netstat -lntp | grep '80' [脚本] #!/bin/bash n=`netsta ...
- Nginx学习笔记(三):Nginx 请求处理
Request Nginx 中的 ngx_http_request_t 是对一个 http 请求的封装: 一个 http 请求包含:请求行.请求头.请求体,响应行.响应头.响应体 Nginx 处理请求 ...
- sql注入测试(3)---现象分析
那为什么出现以上问题呢?这是程序代码层控制不当导致的.如果web前端对输入数据控制严格,会对数据库进行操作的字符串,在客户端做敏感字符转义处理,或者在操作数据库的dao层,使用动态参数的sql,不使用 ...
- Java Web 深入分析(1)B/S架构概述
B/S结构即浏览器和服务器结构.它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构.在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实 ...
- SQLAlchemy 在查询期间丢失与MySQL服务器的连接
遇到问题 pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query') 建立的 pymysq ...
- Opencl 学习笔记
1. HelloWorld
- Go Select使用
原文:https://golangbot.com/pointers/ 作者:Nick Coghlan 译者:Noluye 什么是 select? select 语句用于在多个发送/接收信道操作中进行选 ...
- mongodb聚合查询-aggregate
Mongodb-aggregate 在工作中经常遇到一些mongodb的聚合操作,和mysql对比起来,mongo存储的可以是复杂的类型,比如数组,字典等mysql不善于处理的文档型结构,但是mong ...
- flask中重定向所涉及的反推:由视图函数反推url
flask中重定向所涉及的反推:由视图函数反推url 例如有视图index() 反推 url的/default # -*- coding: utf-8 -*- from flask import Fl ...