Spring---->采用静态配置文件方式实现AOP

spring对AOP的支持(采用配置文件的方式)

1、spring依赖库
              SPRING_HOME/dist/spring.jar
              SPRING_HOME/lib/jakarta-commons/commons-logging.jar
              SPRING_HOME/lib/log4j/log4j-1.2.14.jar
              SPRING_HOME/lib/aspectj/*.jar
2、配置如下

<aop:config>
		<aop:aspect id="security" ref="securityHandler">
			<aop:pointcut id="allAddMethod" expression="execution(* com.bjsxt.spring.UserManagerImpl.add*(..))"/>
			<aop:before method="checkSecurity" pointcut-ref="allAddMethod"/>
		</aop:aspect>
	</aop:config>	
		

二、例子代码

UserManager.java

package com.ncepu.spring;


public interface UserManager {
	public void add(String name,String password);
	public void delete(int id);
	public void modify(String name,String password);
	public void find (int id);
}

UserManagerImpl.java

package com.ncepu.spring;

public class UserManagerImpl implements UserManager {

	@Override
	public void add(String name, String password) {
	System.out.print("添加用户");

	}

	@Override
	public void delete(int id) {
		System.out.print("删除用户");

	}

	@Override
	public void find(int id) {
		System.out.print("查找用户");
	}

	@Override
	public void modify(String name, String password) {
		System.out.print("修改用户");

	}

}

SecurityHandler.java

package com.ncepu.spring;



public class SecurityHandler {

	private void checkSecurity() {
		System.out.println("安全性检查");
	}

}

我们可以通过Advice中添加一个JoinPoint参数,这个值会由spring自动传入,从JoinPoint中可以取得参数值、方法名等等

package com.ncepu.spring;

import org.aspectj.lang.JoinPoint;


public class SecurityHandler {

	private void checkSecurity(JoinPoint jointpoint) {
		Object[] args=jointpoint.getArgs();
		
		for(int i=0;i<args.length;i++)
			System.out.println(args[i]);
		System.out.println(jointpoint.getSignature().getName());
		System.out.println(jointpoint.getTarget());
		System.out.println("安全性检查");
	}

}

Client.java

package com.ncepu.client;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.ncepu.spring.UserManager;

public class Client {
	
	public static void main(String args[])
	{
		BeanFactory factory=new ClassPathXmlApplicationContext("applicationContext.xml");
		UserManager userManager=(UserManager)factory.getBean("usermanager");
		userManager.add("wsz","ncepu");
	}

}

applicationContext.xml

	<bean id="usermanager" class="com.ncepu.spring.UserManagerImpl"></bean>
	<bean id="securityHandler" class="com.ncepu.spring.SecurityHandler"></bean>

	<aop:config>
		<aop:aspect id="security" ref="securityHandler">
			<aop:pointcut id="allAddMethod"
				expression="execution(* com.ncepu.spring.UserManagerImpl.add*(..))" />
			<aop:before method="checkSecurity" pointcut-ref="allAddMethod" />
		</aop:aspect>
	</aop:config>




 

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-core</artifactId> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.8.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.8.2</version> <scope>test</scope> </dependency> <!-- Mockito 模拟框架 --> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> <scope>test</scope> </dependency> <!-- Spring Data JPA --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- MySQL Connector --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies> 加了这些依赖还有报错Could not initialize plugin: interface org.mockito.plugins.MockMaker
最新发布
08-22
根据你提供的依赖配置,虽然排除了 `spring-boot-starter-test` 中的 `mockito-core`,但仍然显式引入了 `mockito-junit-jupiter`,这可能导致 Mockito 版本冲突缺少必要的插件依赖。以下是具体分析和解决方案: --- ### **问题分析** 1. **依赖冲突** - 你排除了 `spring-boot-starter-test` 中的 `mockito-core`,但单独引入了 `mockito-junit-jupiter`。 - 如果 `mockito-junit-jupiter` 的版本与 Spring Boot 管理的 Mockito 版本不一致(例如 Spring Boot 3.x 默认使用 Mockito 4.x,而你显式引入了其他版本),会导致插件初始化失败。 2. **缺少 `byte-buddy`** - Mockito 依赖 `byte-buddy` `cglib` 生成 mock 对象,但你的配置中未显式声明这些依赖。 3. **未配置 `MockMaker` 插件** - 如果测试中使用了需要动态 mock 的功能(如 `@MockBean`、`Mockito.mock()`),但未配置 `mock-maker-inline`,可能会触发此错误。 --- ### **解决方案** #### **1. 统一 Mockito 版本** - **移除显式的 `mockito-junit-jupiter` 依赖**,让 Spring Boot 管理版本: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <!-- 移除 exclusions 确保版本一致 --> </dependency> ``` - **如果必须显式引入 Mockito**,确保版本与 Spring Boot 兼容: ```xml <properties> <mockito.version>4.5.1</mockito.version> <!--Spring Boot 3.x 兼容 --> </properties> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> <version>${mockito.version}</version> <scope>test</scope> </dependency> ``` #### **2. 显式添加 `byte-buddy`** Mockito 需要字节码操作库来生成 mock: ```xml <dependency> <groupId>net.bytebuddy</groupId> <artifactId>byte-buddy</artifactId> <version>1.14.4</version> <!-- 最新稳定版 --> <scope>test</scope> </dependency> ``` #### **3. 配置 `MockMaker` 插件** 在 `src/test/resources/mockito-extensions` 目录下创建文件 `org.mockito.plugins.MockMaker`,内容为: ``` mock-maker-inline ``` 这会强制 Mockito 使用支持静态方法和 final 类的 `mock-maker-inline`。 #### **4. 检查重复依赖** 运行以下命令检查依赖树,确保没有多个 Mockito 版本: ```bash mvn dependency:tree | grep mockito ``` 如果发现冲突,通过 `<exclusions>` 排除旧版本。 --- ### **修复后的依赖配置示例** ```xml <dependencies> <!-- Spring Boot Starter 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- MySQL --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- 测试相关依赖(显式声明版本以避免冲突) --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.8.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.8.2</version> <scope>test</scope> </dependency> <dependency> <groupId>net.bytebuddy</groupId> <artifactId>byte-buddy</artifactId> <version>1.14.4</version> <scope>test</scope> </dependency> </dependencies> ``` --- ### **验证步骤** 1. 清理项目并重新构建: ```bash mvn clean install ``` 2. 运行测试,确认错误是否消失。 3. 如果仍有问题,检查测试代码中是否隐式使用了 Mockito(如 `@MockBean` `Mockito.mock()`),并确保测试类正确注解(如 `@ExtendWith(MockitoExtension.class)`)。 --- ### **总结** 1. **避免显式引入 `mockito-junit-jupiter`**,除非需要特定版本,否则让 Spring Boot 管理依赖。 2. **显式添加 `byte-buddy`** 以确保 Mockito 能生成 mock。 3. **配置 `mock-maker-inline`** 以支持高级 mock 功能。 4. **检查依赖冲突**,确保没有多个 Mockito 版本共存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值