29、(2分)下面哪个不是Spring通知的类型 A、Throws advice(抛出通知) B、Insert advice(插入通知) C、Before advice(前置通知) D、After returning advice(返回后通知
时间: 2023-08-01 12:10:33 浏览: 57
B、Insert advice(插入通知)。Spring AOP 中的通知类型包括 Before advice(前置通知)、After returning advice(返回后通知)、After throwing advice(抛出通知)、After advice(后置通知)和 Around advice(环绕通知)。这些通知类型分别在目标方法执行前、执行后、抛出异常时、执行前后等不同的时刻被调用,可以用于实现日志记录、事务管理、性能监控等功能。其中,Insert advice 并不是 Spring AOP 中的通知类型。
相关问题
springaop中环绕通知方法参数的类型只能是
在Spring AOP中,环绕通知方法必须有一个ProceedingJoinPoint类型的参数,用于控制目标方法的执行。ProceedingJoinPoint接口是JoinPoint接口的子接口,它包含了目标方法的所有信息,包括目标对象、目标方法参数等。因此,环绕通知方法的参数类型只能是ProceedingJoinPoint或其父接口JoinPoint。
除了ProceedingJoinPoint和JoinPoint接口外,环绕通知方法还可以额外接收一个org.aspectj.lang.annotation.Around注解的参数,用于获取注解的信息。例如:
```
@Around("@annotation(myAnnotation)")
public Object myAroundAdvice(ProceedingJoinPoint pjp, MyAnnotation myAnnotation) throws Throwable {
// ...
}
```
上述代码中,通过@Around注解的参数获取了一个名为myAnnotation的注解,并将其传递给环绕通知方法。在环绕通知方法中可以通过该注解获取相应的信息。
需要注意的是,环绕通知方法的返回值必须是Object类型,用于返回目标方法的执行结果。如果目标方法返回类型是void,则环绕通知方法可以返回null或一个空对象。
设计实现@AfterThrowing标注的Advice(异常通知)并通过ApplicationContext验证它
首先,我们需要创建一个Java类来实现异常通知。在这个类中,我们需要使用@Aspect注释来指定它是一个切面类。然后,我们使用@AfterThrowing注释来指定它是一个异常通知,并指定它的切入点表达式和要处理的异常类型。
下面是示例代码:
```java
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class ExceptionLogger {
@AfterThrowing(pointcut = "execution(* com.example.demo.service.*.*(..))", throwing = "ex")
public void logException(Exception ex) {
System.out.println("Exception occurred: " + ex.getMessage());
}
}
```
在这个示例中,我们创建了一个名为ExceptionLogger的类,它实现了异常通知。我们使用@AfterThrowing注释来指定这是一个异常通知,并使用pointcut属性来指定切入点表达式。在这个例子中,我们使用了一个简单的切入点表达式来匹配com.example.demo.service包中的所有方法。我们还使用throwing属性来指定要处理的异常类型。
在logException()方法中,我们打印出异常消息。
接下来,我们需要将这个类添加到Spring应用程序上下文中。我们可以在应用程序的配置类中使用@ComponentScan和@EnableAspectJAutoProxy注释来启用自动扫描和自动代理。
下面是示例代码:
```java
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@Configuration
@ComponentScan(basePackages = "com.example.demo")
@EnableAspectJAutoProxy
public class AppConfig {
}
```
在这个示例中,我们创建了一个名为AppConfig的配置类,并使用@ComponentScan注释来指定要扫描的基本包。我们还使用@EnableAspectJAutoProxy注释来启用自动代理。
现在我们可以测试我们的异常通知是否正常工作。我们可以创建一个简单的服务类,并在其中引发一个异常。
下面是一个示例服务类的代码:
```java
import org.springframework.stereotype.Service;
@Service
public class MyService {
public void doSomething() throws Exception {
throw new Exception("Something went wrong!");
}
}
```
在这个例子中,我们创建了一个名为MyService的服务类,并在doSomething()方法中引发了一个异常。
最后,我们可以在应用程序的主类中创建一个ApplicationContext并使用它来获取MyService bean并调用它的doSomething()方法。
下面是一个简单的示例代码:
```java
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MyService service = context.getBean(MyService.class);
try {
service.doSomething();
} catch (Exception ex) {
// Exception will be caught by ExceptionLogger advice
}
}
}
```
在这个示例中,我们创建了一个名为Main的主类,并在其中创建了一个ApplicationContext。然后,我们使用ApplicationContext来获取MyService bean并调用它的doSomething()方法。由于我们在doSomething()方法中引发了一个异常,这个异常将被ExceptionLogger advice捕获,并打印出消息。
现在,当我们运行这个示例应用程序时,我们应该能够看到ExceptionLogger advice打印出异常消息。