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
目录
相关文章
|
5天前
|
XML Java 开发者
Spring Boot中的AOP实现
Spring AOP(面向切面编程)允许开发者在不修改原有业务逻辑的情况下增强功能,基于代理模式拦截和增强方法调用。Spring Boot通过集成Spring AOP和AspectJ简化了AOP的使用,只需添加依赖并定义切面类。关键概念包括切面、通知和切点。切面类使用`@Aspect`和`@Component`注解标注,通知定义切面行为,切点定义应用位置。Spring Boot自动检测并创建代理对象,支持JDK动态代理和CGLIB代理。通过源码分析可深入了解其实现细节,优化应用功能。
|
26天前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
168 73
|
21天前
|
Java Spring 容器
【SpringFramework】Spring IoC-基于注解的实现
本文主要记录基于Spring注解实现IoC容器和DI相关知识。
50 21
|
13天前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
56 8
|
26天前
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
|
26天前
|
Java Spring
【Spring配置】idea编码格式导致注解汉字无法保存
问题一:对于同一个项目,我们在使用idea的过程中,使用汉字注解完后,再打开该项目,汉字变成乱码问题二:本来a项目中,汉字注解调试好了,没有乱码了,但是创建出来的新的项目,写的注解又成乱码了。
|
2月前
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
96 5
|
2月前
|
前端开发 Java Spring
Spring MVC核心:深入理解@RequestMapping注解
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的核心,它将HTTP请求映射到控制器的处理方法上。本文将深入探讨`@RequestMapping`注解的各个方面,包括其注解的使用方法、如何与Spring MVC的其他组件协同工作,以及在实际开发中的应用案例。
55 4
|
2月前
|
Java 开发者 Spring
Spring AOP 底层原理技术分享
Spring AOP(面向切面编程)是Spring框架中一个强大的功能,它允许开发者在不修改业务逻辑代码的情况下,增加额外的功能,如日志记录、事务管理等。本文将深入探讨Spring AOP的底层原理,包括其核心概念、实现方式以及如何与Spring框架协同工作。
|
2月前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
188 2