大家好,我是【1+1=王】, 热爱java的计算机(人工智能)渣硕研究生在读。
如果你也对java、人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!!
Good better best, never let it rest, until good is better, and better best.
近期会重新温习一下SSM的相关知识,相应的博客会更新至专栏【SSM框架】中,欢迎大家关注!
SSM专栏:https://blog.csdn.net/weixin_43598687/category_11652306.html
学习AOP开发之前你需要连接java的动态代理机制,如果大家对动态代理还比较陌生的话可以参考我的这篇文章:
**【动态代理】—— JDK和cglib的动态代理:**https://blog.csdn.net/weixin_43598687/article/details/123583023
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
AOP开发是以动态代理为底层原理的,它的开发步骤也与动态代理类似,只是把方法增强部分交给了Spring去管理。
下面介绍AOP开发的两种方式:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!-- AOP -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.13</version>
</dependency>
public class Target implements TargetInterface {
@Override
public void coreWork() {
System.out.println("===核心业务方法运行===");
}
}
public interface TargetInterface {
public void coreWork();
}
public class Aspect {
public void before(){
System.out.println("对核心业务方法执行前的增强......");
}
public void after(){
System.out.println("后置增强......");
}
<!-- 目标对象 -->
<bean id="target" class="com.wang.aop.Target"></bean>
<!-- 切面对象 -->
<bean id="aspect" class="com.wang.aop.Aspect"></bean>
<aop:config>
<aop:aspect ref="aspect">
<aop:before method="before" pointcut="execution(public void com.wang.aop.Target.coreWork())"/>
<aop:after method="after" pointcut="execution(public void com.wang.aop.Target.coreWork())"/>
</aop:aspect>
</aop:config>
测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class AopTest {
@Autowired
private TargetInterface target;
@Test
public void test() {
target.coreWork();
}
}
execution([修饰符] 返回值类型包名.类名.方法名(参数))
<aop:通知类型method=“切面类中方法名” pointcut=“切点表达式"></aop:通知类型>
通知类型 | 标签 | 解释 |
---|---|---|
前置通知 | aop:before | 用于配置前置通知。指定增强的方法在切入点方法之前执行 |
后置通知 | aop:after-returning | 用于配置后置通知。指定增强的方法在切入点方法之后执行 |
环绕通知 | aop:around> | 用于配置环绕通知。指定增强的方法在切入点方法之前和之后都执行 |
异常抛出通知 | aop:throwing> | 用于配置异常抛出通知。指定增强的方法在出现异常时执行 |
最终通知 | aop:after> | 用于配置最终通知。无论增强方式执行是否有异常都会执行 |
<aop:config>
<aop:aspect ref=“切面类”>
<aop:before method=“通知方法名称” pointcut=“切点表达式"></aop:before>
</aop:aspect>
</aop:config>
基于注解开发,Spring也提供了注解的AOP开发。
public class Target implements TargetInterface {
@Override
public void coreWork() {
System.out.println("===核心业务方法运行===");
}
}
public interface TargetInterface {
public void coreWork();
}
public class Aspect {
public void before(){
System.out.println("对核心业务方法执行前的增强......");
}
public void after(){
System.out.println("后置增强......");
}
@Component("aspect")
@Aspect
public class MyAspect {
@Before("execution(* com.wang.aop.innovation.*.*(..))")
public void before(){
System.out.println("对核心业务方法执行前的增强......");
}
@After("execution(* com.wang.aop.innovation.*.*(..))")
public void after(){
System.out.println("后置增强......");
}
}
<context:component-scan base-package="com.wang.aop.innovation"/>
<!--aop的自动代理-->
<aop:aspectj-autoproxy/>
测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class AopTest {
@Autowired
private TargetInterface target;
@Test
public void test() {
target.coreWork();
}
}
通知类型 | 注解 | 解释 |
---|---|---|
前置通知 | @Before | 用于配置前置通知。指定增强的方法在切入点方法之前执行 |
后置通知 | @after-returning | 用于配置后置通知。指定增强的方法在切入点方法之后执行 |
环绕通知 | @around | 用于配置环绕通知。指定增强的方法在切入点方法之前和之后都执行 |
异常抛出通知 | @throwing | 用于配置异常抛出通知。指定增强的方法在出现异常时执行 |
最终通知 | @after | 用于配置最终通知。无论增强方式执行是否有异常都会执行 |
SSM专栏:https://blog.csdn.net/weixin_43598687/category_11652306.html
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_43598687/article/details/123744357
内容来源于网络,如有侵权,请联系作者删除!