AOP

切面就像一把菜刀,将Java处理业务流程进行分割,在分割处添加特定的业务处理。主要应用于声明事务、安全和缓存。在本文中,主要介绍两种切面的实现方法–Java配置和XML配置。

Java配置

  • 创建Java类
    创建一个Music的Java类,用于声明切点
    “`
    @Component
    public class Music {

    public void perform(int num){
    System.out.println(“music”);
    }

}

- **创建切面**
创建Aop Java类,并声明为切面。声明为切面使用注解@Aspect,同时,切面必须是一个Bean。同时,声明一个切点,避免创建通知的时候重复使用过长的表达式。

@Component
@Aspect
public class Aop {

@Pointcut("execution(** com.tidas.spring.fourth.aopjavaconfig.Music.*(..))")
public void performer(){}

@Before("performer()")
public void beforee(){
    System.out.println("before");
}

@After("performer()")
public void afterr(){
    System.out.println("after");
}

@AfterReturning("performer()")
public void afterReturning(){
    System.out.println("afterreturning");
}

@AfterThrowing("performer()")
public void throwingg(){
    System.out.println("throwing");
}
- **创建Java配置类**
创建JavaConfiguration 类,创建Bean工厂,在这里需要使用@EnableAspectAutoProxy注解启动Spring切面功能

@Configuration
@EnableAspectJAutoProxy
@ComponentScan
public class JavaConfiguration {

}

- **创建测试类**
创建Main测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=JavaConfiguration.class)
public class Main {

@Autowired
private Music music;
@Test
public void test(){
    music.perform(3);
}

}

- **为通知传递参数**
希望将声明为切点方法中的参数传递到通知当中其,则需要在声明切点的使用指明args参数,在Java中使用&& 在xml中使用and,下面是创建为通知传递参数的切面:

/*@Pointcut(“execution(** com.tidas.spring.fourth.aopjavaconfig.Music.perform(int)) && args(number)”)
public void performer(int number){}

@Before("performer(number)")
public void beforee(int number){
    System.out.println("before" + number);
}

@After("performer(number)")
public void afterr(int number){
    System.out.println("after" + number+2);
}

@AfterReturning("performer(number)")
public void afterReturning(int number){
    System.out.println("afterreturning" + number+1);
}

@AfterThrowing("performer(number)")
public void throwingg(int number){
    System.out.println("throwing" + number +3);
}
- 另外,还可以使用@Around穿件环绕通知,被声明为环绕通知的方法需要包含参数ProceedingJoinPoint,通过ProceedingJoinPoint.proceed()来区分前置 通知和后置通知,通过try...catch来获取异常通知

@Component
@Aspect
public class AopSecond {

@Pointcut("execution(** com.tidas.spring.fourth.aopjavaconfig.Music.perform(..))")
public void performer(){}

@Around("performer()")
public void per(ProceedingJoinPoint jb){
    try{
        System.out.println("beforeer");
        jb.proceed();
        System.out.println("afterr");
    }catch(Throwable eThrowable){
        System.out.println("exception");
    }
    
}

}

####**XML中配置切面**
- 创建Java类

@Component
public class AopXml {

public void performA(){
    System.out.println("performA");
}

public void performB(){
    System.out.println("performB");
}

}

- 创建切面类

@Component
public class AopConfug {

public void beforee(){
    System.out.println("before");
}

public void afterr(){
    System.out.println("after");
}

public void aroundd(ProceedingJoinPoint pb) throws Throwable{
    System.out.println("beforeeee");
    pb.proceed();
    System.out.println("afterrrr");
}

}

- 创建xml配置文件,其中需要添加`xmlns:context="http://www.springframework.org/schema/context" ` 和`http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
`,来支持component-scan,同时,还需要配置`<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>`支持自动注入

    <aop:after pointcut-ref = "aopxmll" method="afterr"/>
    
    <aop:around pointcut-ref = "aopxmll" method="aroundd"/>
    <!-- 对于环绕通知,其实在xml中声明和其它通知声明一样,没有参数,而参数还是在具体的方法中就好 -->
</aop:aspect>

- 为通知传递参数
创建带参数的通知

//有参数
/public void beforee(int number){
System.out.println(“number:” + number);
}
/

创建带参数的方法

//有参数
public void perform(int number){
System.out.println(“perform2”);
}

切面和切点的配置,在xml中使用and连接args参数

    <aop:before pointcut-ref = "aopxmll" method="beforee"/>
</aop:aspect>

“`

通过切面为Java引入新的功能

版权声明:本文为tidas809原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/tidas809/p/8320367.html