Spring中AOP最简单实例-@注解形式

简介: Spring中AOP最简单实例-@注解形式

Spring中AOP最简单实例-@注解形式

一、项目结构

二、基于maven(引入Jar包)

在引入pom文件时,需要注意:

第一,因为使用的是结合Spring的,要引入Spring的pom。统一版本为5.1.5.RELEASE。

<properties>
    <spring.version>5.1.5.RELEASE</spring.version>
</properties>
spring相关Jar包引入
         <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>

第三,用到测试类,引入junit 测试包

aspect相关Jar包
         <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.9.2</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.2</version>
        </dependency>

第四,用到日志,加入log4j

日志相关Jar
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
 
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

三、实体类(需要被切面切的类)--HelloWorld

package com.isoftstone.mcb;
 
import org.apache.log4j.Logger;
 
public class HelloWorld {
 
    private final static Logger logger = Logger.getLogger(HelloWorld.class);
 
    private String name;
 
    public String getName() {
        logger.info("我的名字是 "+ name);
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public void printException(){
        logger.info("我扔出了一个IllegalArgumentException异常");
        throw new IllegalArgumentException();
    }
 
}

四、切面类(切入到别人的类)--注解类--AspectAop

package com.isoftstone.mcb;
 
import org.apache.log4j.Logger;
import org.aspectj.lang.annotation.*;
 
@Aspect
public class AspectAop {
    private final static Logger logger = Logger.getLogger(HelloWorld.class);
    @Pointcut("execution(* com.isoftstone.mcb.HelloWorld.*(..))")
    private void aspectAll(){
    }
    @Before("aspectAll()")
    public void beforeAdvice(){
        logger.info("我是 beforeAdvice ");
    }
    @After("aspectAll()")
    public void afterAdvice(){
        logger.info("我是 afterAdvice ");
    }
    @AfterReturning(pointcut = "aspectAll()", returning = "returnValue")
    public void afterReturning(Object returnValue) {
        logger.info("afterReturning,返回值"+ returnValue);
    }
    @AfterThrowing(pointcut = "aspectAll()", throwing = "ex")
    public void afterThrowing(Exception ex) {
        logger.info("我捕获了一个异常信息 "+ ex.toString());
    }
}

五、配置类(Spring管理)--注解类--SpringConfig

package com.isoftstone.config;
 
import com.isoftstone.mcb.AspectAop;
import com.isoftstone.mcb.HelloWorld;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
 
@Configuration
@EnableAspectJAutoProxy
public class SpringConfig {
    @Bean
    public HelloWorld helloWorld(){
        HelloWorld helloWorld  = new HelloWorld();
        helloWorld.setName("lisi");
        return helloWorld;
    }
    @Bean
    public AspectAop aspectAop() {
        return new AspectAop();
    }
}

六、log4j配置输出到控制台-log4j.properties

# Define the root logger with appender file
log4j.rootLogger = info,stdout,D,E
 
### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
#log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

七、测试类--AopTest

package com.isoftstone;
 
import com.isoftstone.config.SpringConfig;
import com.isoftstone.mcb.HelloWorld;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 
public class AopTest {
    @Test
    public void testAop() {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
        HelloWorld helloWorld = applicationContext.getBean(HelloWorld.class);
        helloWorld.getName();
        helloWorld.printException();
    }
 
}

八、测试结果

log4j:ERROR Could not instantiate appender named "E".
我是 beforeAdvice 
我的名字是 lisi
我是 afterAdvice 
afterReturning,返回值lisi
我是 beforeAdvice 
我扔出了一个IllegalArgumentException异常
我是 afterAdvice 
我捕获了一个异常信息 java.lang.IllegalArgumentException
 
java.lang.IllegalArgumentException
目录
相关文章
|
21天前
|
监控 安全 Java
Spring AOP实现原理
本内容主要介绍了Spring AOP的核心概念、实现机制及代理生成流程。涵盖切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)等关键概念,解析了JDK动态代理与CGLIB代理的原理及对比,并深入探讨了通知执行链路和责任链模式的应用。同时,详细分析了AspectJ注解驱动的AOP解析过程,包括切面识别、切点表达式匹配及通知适配为Advice的机制,帮助理解Spring AOP的工作原理与实现细节。
|
3月前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
278 26
|
4月前
|
XML Java 开发者
Spring Boot中的AOP实现
Spring AOP(面向切面编程)允许开发者在不修改原有业务逻辑的情况下增强功能,基于代理模式拦截和增强方法调用。Spring Boot通过集成Spring AOP和AspectJ简化了AOP的使用,只需添加依赖并定义切面类。关键概念包括切面、通知和切点。切面类使用`@Aspect`和`@Component`注解标注,通知定义切面行为,切点定义应用位置。Spring Boot自动检测并创建代理对象,支持JDK动态代理和CGLIB代理。通过源码分析可深入了解其实现细节,优化应用功能。
223 6
|
4月前
|
缓存 Java 数据库
SpringBoot缓存注解使用
Spring Boot 提供了一套方便的缓存注解,用于简化缓存管理。通过 `@Cacheable`、`@CachePut`、`@CacheEvict` 和 `@Caching` 等注解,开发者可以轻松地实现方法级别的缓存操作,从而提升应用的性能和响应速度。合理使用这些注解可以大大减少数据库的访问频率,优化系统性能。
252 89
|
2月前
|
JSON 前端开发 Java
Spring MVC常用的注解
@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中 的所有响应请求的方法都是以该地址作为父路径。 @RequestBody:注解实现接收http请求的json数据,将json转换为java对象。 @ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。 @Controller:控制器的注解,表示是表现层,不能用用别的注解代替 @RestController : 组合注解 @Conntroller + @ResponseBody @GetMapping , @PostMapping , @Put
|
2月前
|
Java Spring
Spring Boot的核心注解是哪个?他由哪几个注解组成的?
Spring Boot的核心注解是@SpringBootApplication , 他由几个注解组成 : ● @SpringBootConfiguration: 组合了- @Configuration注解,实现配置文件的功能; ● @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项 ● @ComponentScan:Spring组件扫描
|
2月前
|
Java 测试技术 Spring
SpringBoot+@Async注解一起用,速度提升
本文介绍了异步调用在高并发Web应用性能优化中的重要性,对比了同步与异步调用的区别。同步调用按顺序执行,每一步需等待上一步完成;而异步调用无需等待,可提升效率。通过Spring Boot示例,使用@Async注解实现异步任务,并借助Future对象处理异步回调,有效减少程序运行时间。
|
1月前
|
人工智能 缓存 自然语言处理
保姆级Spring AI 注解式开发教程,你肯定想不到还能这么玩!
这是一份详尽的 Spring AI 注解式开发教程,涵盖从环境配置到高级功能的全流程。Spring AI 是 Spring 框架中的一个模块,支持 NLP、CV 等 AI 任务。通过注解(如自定义 `@AiPrompt`)与 AOP 切面技术,简化了 AI 服务集成,实现业务逻辑与 AI 基础设施解耦。教程包含创建项目、配置文件、流式响应处理、缓存优化及多任务并行执行等内容,助你快速构建高效、可维护的 AI 应用。
|
3月前
|
监控 Java Spring
SpringBoot:SpringBoot通过注解监测Controller接口
本文详细介绍了如何通过Spring Boot注解监测Controller接口,包括自定义注解、AOP切面的创建和使用以及具体的示例代码。通过这种方式,可以方便地在Controller方法执行前后添加日志记录、性能监控和异常处理逻辑,而无需修改方法本身的代码。这种方法不仅提高了代码的可维护性,还增强了系统的监控能力。希望本文能帮助您更好地理解和应用Spring Boot中的注解监测技术。
106 16
|
3月前
|
XML Java 测试技术
Spring AOP—通知类型 和 切入点表达式 万字详解(通俗易懂)
Spring 第五节 AOP——切入点表达式 万字详解!
195 25