什么是AOP?
AOP叫做面向切面编程,是一种编程思想
传统的OOP编程大多是纵向编程,我们需要修改原有业务逻辑就只能去修改源码。
AOP编程可以在我们纵向编程的基础上,织入新的逻辑而不影响原有代码。
AOP编程怎么用?
首先我们要引入aspect包
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
这里我们用看电影这一事件进行实例,我们设定原有的逻辑如下
现在我们需要织入一些新的逻辑而不更改原有逻辑的代码,这里我们就要用到AOP面向切面编程了。如下图所示我们在原有的逻辑中打开一个切口横向去织入我们新的逻辑。
接下来我们用代码来解析一下以下过程:
首先我们来创建一个Movie类写入这些逻辑
package aop;
public class Movie
{
public void buyTicket()
{
System.out.println("买票..");
}
public void checkTicket()
{
System.out.println("检票");
}
public void watchMovie()
{
System.out.println("看电影..");
}
public void goHome()
{
System.out.println("回家..");
}
}
接下来我们创建一个MovieAspect的切面类,在里面声明切入点以及写下我们需要织入的逻辑:
package aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
@Aspect //申明这是一个切面类
public class MovieAspect
{
//声明一个切入点
@Pointcut(value = "execution(public void aop.Movie.watchMovie())")
public void pointCut()
{}
@Before(value = "pointCut()")//切入点前置增强
public void beforeLogic()
{ System.out.println("买水。。");}
@After(value = "pointCut()")//切入点后置增强
public void afterLogic()
{ System.out.println("上厕所....");}
}
接下来我们来创建一个配置类来对以上两个类进行配置:
package aop;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@Configuration//声明这是一个配置类
@EnableAspectJAutoProxy //打开切面的自动代理
public class SpringConfigAOP
{
@Bean
public Movie getMovie()
{
return new Movie();
}
@Bean
public MovieAspect getAspect()
{
return new MovieAspect();
}
}
最后我们来测试以下我们的结果:
package aop;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;
@Component
public class RunTest
{
public static void main(String[] args)
{
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfigAOP.class);
Movie himom = context.getBean(Movie.class);
himom.buyTicket();
himom.checkTicket();
himom.watchMovie();
himom.goHome();
}
}
结果如图所示,我们成功地运用了AOP编程织入了新的逻辑而没有改变原来逻辑的代码,下面是AOP编程的一些比较重要的注解:
@before //切入点前置增强
@Pointcut //切入点
@enableaspectproxy //打开切面的自动代理
@afterthrowing //后置异常 如果切入点异常可以进行补偿
@afterreturning //后置正常
@aroud //环绕增强 (前后都会去进行增强)
OOP主题业务流程,专注于业务逻辑的组织,增强类的全局统一的逻辑,交由AOP去实现。