今天给大家带来的是Spring框架中除开IOC(控制反转)之外的第二大特性-AOP(切面编程),在实际开发中,方法执行情况中都要添加日志或者权限验证的事情,而这时候,不需要将流程式的代码加到主体业务逻辑代码中就可以走过上面常用的流程。
AOP则将封装好的对象剖开,找出其中对多个对象产生影响的公共行为,并将其封装为一个可重用的模块,这个模块被命名为“切面”(Aspect)。 切面将那些与业务无关,却被业务模块共同调用的逻辑提取并封装起来,减少了系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。 这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
这次分享的一个小案例是吃饭,所谓民以食为天,吃的食物可能不同,可能吃米饭、也可能吃面条,但是吃饭前的端碗和吃饭后的放下筷子的流程却是必不可少的,在过去的编程中,端碗和放筷子在吃米饭和吃面条的方法都有体现,引入AOP后,端碗等流程代码就与吃饭的业务逻辑分离开来,一方面,横切关注点和业务逻辑分开了,另一方面上也增强了方法。
以下是简单的代码:
1.创建Eat接口,存在eating()方法.
public interface Eat {
public void eating();
}
2.EatingRice类和EatingNoodle类,实现Eat接口
public class EatingRice implements Eat {
public void eating() {
System.out.println("让我们开心地吃米饭吧");
}
}
public class EatingNoodle implements Eat {
public void eating() {
System.out.println("一起来吃面条吧");
}
}
4.定义切面类
//指定该类为切面类
@Aspect
public class Process {
//统一定义切点
@Pointcut("execution(* com.cn.Eat.eating(..))")
public void eat(){}
@Before("eat()")
public void holdTheBowl(){
System.out.println("端碗");
}
@AfterReturning("eat()")
public void PutTheChopsticks(){
System.out.println("放筷子");
}
}
1. @Aspect 切面类注解
2. 各类Advice注解,代表何时执行横切方法,在业务逻辑方法之前、之后等。
@Before 注解 代表该方法在业务逻辑方法之前执行
@After注解 代表改方法在业务逻辑方法之后执行,无论是否发生异常均会执行
@AfterReturning 代表改方法在业务逻辑方法正常执行后运行,如方式异常则不执行
@AfterThrowing 代表该方法在业务逻辑方法发生异常之后执行。
@Around注解 环绕通知。可以把Before、After、AfterReturning、AfterThrowing整合起来,通过ProceedingJointPoint执行业务逻辑功能方法。
5.使用配置类创建Bean
//支持切面代理
@EnableAspectJAutoProxy
//Bean的扫描器
@ComponentScan
//声明为配置类
@Configuration
public class EatConfig {
@Bean
public Process getProcess(){
return new Process();
}
//由于Eat接口下有两个实现类,需按名称找Bean,定义Bean的名称
@Bean(name = "eatingRice")
public Eat getRice(){
return new EatingRice();
}
@Bean(name = "eatingNoodle")
public Eat getNoodle(){
return new EatingNoodle();
}
}
6.测试
public class Test {
public static void main(String[] args) {
ApplicationContext context;
//创建注解配置类型的Spring容器
context = new AnnotationConfigApplicationContext(EatConfig.class);
//取Bean
Eat eatingRice =(Eat) context.getBean("eatingRice");
//执行业务
eatingRice.eating();
System.out.println("___________________");
Eat eatingNoodle =(Eat) context.getBean("eatingNoodle");
eatingNoodle.eating();
}
}
7.执行后效果
8.很高兴你们看完了最后,你的进步就是我最大的快乐。若要下载源代码,点击此处