1.AOP及其相关概念
1)AOP 面向切面(方面)编程
主要解决共通处理问题.可以将共通处理部分单独用一个组件封装起来,然后利用SpringAOP机制作用到某一批目标对象上面.从而降低共通处理对象和目标对象之间关联.
AOP与OOP关系,OOP面向对象编程,侧重于对象的封装;AOP面向切面编程是以OOP为基础,侧重于对共通处理的操作.改善程序结构,提高灵活性.
2)切面(方面)Aspect
指的是共通处理部分的代码.也称为关注点的实现.
3)连接点Joinpoint
指的是作用在目标对象上的位置.例如方法调用,异常发生后等
4)切入点Pointcut
指的是连接点的集合,对应一个切入点表达式.
5)目标对象Target Object
指的是使用切面功能的对象.需要在Spring容器中.
6)通知 Advice
指的是连接点作用的时机.例如方法调用前,方法调用后执行切面功能等.
7)动态代理AutoProxy
采用AOP之后,Spring会为每一个目标对象创建一个代理对象,该代理对象相当于切面和目标对象功能的结合体.
Spring采用两种方式:
a.JDK Proxy方式
适用于目标对象有接口.
b.CGLIB方式
适用于目标对象没有接口.
2.AOP使用示例
UserDAO.java:
1
2
3
4
5
6
7
|
package com.weishuzhai.target;
public interface UserDAO {
public void save();
public void findByEmail(String email);
}
|
实现类UserDAOImpl.java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package com.weishuzhai.target;
public class JDBCUserDAOImpl implements UserDAO {
public void findByEmail(String email) {
System.out.println("采用JDBC技术保存用户信息");
}
public void save() {
System.out.println("采用JDBC技术查询用户信息");
}
}
|
UserService.java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
package com.weishuzhai.user;
import org.junit.Test;
import com.weishuzhai.target.UserDAO;
public class UserService {
public UserDAO userDao;
public void setUserDao(UserDAO userDao) {
this.userDao = userDao;
}
/**
* 注册业务方法
*
*/
public void regist() {
// System.out.println("-- 欢迎使用该功能 --");
System.out.println("数据保存成功!谢谢使用!");
userDao.save();
}
/**
* 登录业务方法
*
*/
public void login() {
System.out.println("登录成功,谢谢使用!");
userDao.findByEmail("Tom");
}
}
|
1)示例步骤
a.引入jar包
aspectjweaver.jar
aspectjrt.jar
cglib-nodep-2.1_3.jar
commons-logging.jar
spring.jar
b.寻找关注点,采用切面组件封装.
切面组件MyAspect.java:
1
2
3
4
5
6
7
8
9
10
11
|
package com.weishuzhai.aspect;
public class MyAspect {
public void myAspectBefore() {
System.out.println("-- 欢迎使用该功能 --");
}
public void myAspectAfter() {
System.out.println("-- 功能使用结束!谢谢使用 --");
}
}
|
c.在spring配置中添加AOP配置
添加aop命名空间
指定切面
定义切入点
指定切入点采用哪种类型的通知
spring配置文件applicationContext.xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
< ?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"
default-lazy-init="true">
<bean id="userDAO" class="com.weishuzhai.target.JDBCUserDAOImpl"/>
<bean id="userService" class="com.weishuzhai.user.UserService">
<property name="userDao" ref="userDAO"></property>
</bean>
<!-- AOP配置 -->
<bean id="myAspect" class="com.weishuzhai.aspect.MyAspect"/>
<aop:config>
<!-- 将myAspect Bean组件指定为切面组件 -->
<aop:aspect id="aspectEx" ref="myAspect">
<!-- 切入点,匹配UserService类中的所有方法 -->
<aop:pointcut id="servicePointcut" expression="execution(* com.weishuzhai.user.UserService.*(..))"></aop:pointcut>
<!-- 定义前置通知.指定切面组件中的myAspectbefore方法,在切入点之前调用 -->
<aop:before pointcut-ref="servicePointcut" method="myAspectBefore"></aop:before>
<!-- 定义最终通知,指定切面组件中的myAspectAfter方法,在切入点之后调用 -->
<aop:after pointcut-ref="servicePointcut" method="myAspectAfter"></aop:after>
</aop:aspect>
</aop:config>
</beans>
|
d.测试执行TestUserService.java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package com.weishuzhai.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.weishuzhai.user.UserService;
public class TestUserService {
@Test
public void test() {
ApplicationContext ac = new ClassPathXmlApplicationContext(
"applicationContext.xml");
UserService service = (UserService) ac.getBean("userService");
service.regist();
service.login();
}
}
|
运行结果:
3.通知类型
1)前置通知
目标对象方法调用前执行.
2)后置通知
1
|
<aop:after -returning/>
|
目标对象方法成功调用之后执行.
3)最终通知
目标对象方法调用之后执行,不论是成功还是失败.
4)环绕通知
目标对象方法调用之前和之后执行.
5)异常通知
目标对象方法调用出现异常后执行.
try{
前置通知
环绕通知1
目标对象方法
环绕通知1
后置通知
}catch(){
异常通知
}finally{
最终通知
}
4.切入点表达式
*1)方法限定execution
示例1:任意公共方法的执行
execution (public * *(..))
示例2:任何一个名字以“set”开始的方法的执行
execution (* set*(..))
示例3:AccountService中定义的任意方法的执行
execution (* service.AccountService.*(..))
示例4:在service包中定义的任意方法的执行
execution (* service.*.*(..))
示例5:在service包或其子包中定义的任意方法的执行
execution (* service..*.*(..))
*2)类型限定within
示例1:AccountService中定义的任意方法的执行
within (service.AccountService)
示例2:在service包中定义的任意类型的任意方法
within (service.*)
示例3:在service包或其子包中定义的任意类型的任意方法
within (service..*)
*3)Bean对象名限定bean
示例:匹配所有的id或name名字以Service结束的组件
bean(*Service)
4)特定类型限定this或target
this指的是限定特定的代理类型
target指的是限定特定的目标对象类型
示例1:实现了AccountService的代理对象
this (service.AccountService)
示例2:实现了AccountService的目标对象
target (service.AccountService)
5)方法参数限定args
示例:匹配方法有一个String参数的
args (java.lang.String)
—————————–
分享到:
相关推荐
在本次的Java Spring框架学习笔记中,将对Spring框架的核心概念进行详细解析,包括Spring的 IOC(控制反转)、AOP(面向切面编程)、jdbcTemplate、事务管理、Spring5新特性以及与Mybatis的整合。本学习笔记提供了...
本资料“Spring学习笔记&源码”是基于网易云课堂黑马程序员的Spring四天精通课程,旨在帮助学习者深入理解和实践Spring框架。 笔记部分可能会涵盖以下内容: 1. **Spring概述**:介绍Spring框架的历史、特点和主要...
Spring框架是Java应用开发中广泛使用的轻量级框架,它以IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)为核心,提供了丰富的功能,包括但不限于组件管理、AOP(Aspect Oriented ...
**Spring AOP 学习笔记及实现Demo** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。AOP的主要目的...
在本篇Spring学习笔记中,我们将深入探讨如何利用Spring框架的注解方式来实现面向切面编程(AOP)。AOP是一种编程范式,它允许我们定义横切关注点,如日志、事务管理等,然后将这些关注点模块化并插入到应用程序的多...
"Spring笔记示例源代码"这个资源很可能是为了帮助学习者深入理解Spring框架的各种功能和用法而提供的实际代码示例。 1. **Spring IoC**:IoC是Spring的核心特性,它将对象的创建和管理权交给Spring容器,使得开发者...
在本学习笔记中,我们将深入探讨JavaEE中的Spring框架,这是一个强大的、全面的企业级应用程序开发框架,它简化了Java开发并提供了丰富的功能。Spring的核心特性包括依赖注入(DI)、面向切面编程(AOP)以及对Java ...
【Spring AOP源码笔记】 Spring AOP是Spring框架的核心组件之一,它实现了面向切面编程(Aspect-Oriented Programming,简称AOP),允许开发者定义“切面”,这些切面可以封装横切关注点,如日志记录、事务管理等。...
这篇“学习Spring笔记_AOP_Annotation实现和XML实现”主要探讨了如何在Spring中利用注解和XML配置来实现AOP的概念。 AOP,全称Aspect-Oriented Programming,是一种编程范式,旨在将关注点分离,让开发者可以更专注...
这份"Spring5框架课堂笔记.pdf"应该详细讲解了以上各知识点,并可能包含示例代码和实践指导,对于学习和进阶Spring框架是非常宝贵的资源。通过深入学习和实践,开发者可以有效地利用Spring5框架构建高效、可维护的...
动力节点老杜Spring6配套笔记主要讲解了Spring框架的一些核心概念和最佳实践,特别是针对代码设计中的开闭原则(Open-Closed Principle, OCP)进行了深入探讨。在给出的代码示例中,我们可以看到一个简单的用户登录...
**步骤2:配置Spring环境** - 将下载的jar包添加到项目的类路径中。 - 创建Spring配置文件(如 `applicationContext.xml`),用于配置Bean的实例化信息。 **步骤3:编写代码** - 在Java类中通过Spring容器获取...
在本篇Spring学习笔记中,我们将深入探讨如何利用Spring配置文件来实现面向切面编程(AOP)。面向切面编程是Spring框架的核心特性之一,它允许我们把关注点分离,将横切关注点(如日志、事务管理、权限控制等)与...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了一种将业务逻辑与系统服务(如日志、事务管理等)分离的方法,使得我们可以更好地关注核心业务,而无需在每个...
SSH-AOP笔记主要涵盖的是Spring、Struts和Hibernate三大框架集成使用时,如何结合Aspect Oriented Programming(面向切面编程)的理念进行应用增强。在Java企业级开发中,SSH是常用的MVC架构,而AOP则是一种编程范式...
【标题】:“Spring学习笔记0.0.0” 在IT领域,Spring框架是Java...这本笔记可能会按照以上这些主题进行深入探讨,同时结合作者的实际经验,给出具体的代码示例和问题解决方案,帮助读者逐步掌握Spring框架的使用。
本篇学习笔记详细介绍了面向切面编程的基本概念及其在Spring框架中的应用,特别是在使用JDK动态代理创建代理对象方面给出了具体示例。通过理解和掌握这些知识点,可以帮助开发者更好地利用Spring框架的强大功能,...
在“Java Spring学习笔记”中,你将找到对Spring框架的全面介绍,包括IoC(控制反转)和DI(依赖注入)原理、AOP(面向切面编程)、Spring MVC、Spring Boot等核心内容。每个主题都结合了理论知识和实际示例,帮助你...
Spring.NET提供了多种AOP实现,包括基于代理的AOP和基于IL weaving的AOP,学习笔记会阐述这些实现方式及其使用场景。 4. **数据访问支持**:Spring.NET集成了多种数据库访问技术,如ADO.NET、NHibernate和Entity ...