Spring使用AOP案例
假设我们有一个UserService接口和实现类UserServiceImpl,其中有一个addUser方法用于添加用户信息。我们希望在该方法执行前后分别打印日志。
- 定义切面类
首先,我们需要定义一个切面类来实现日志的打印。该类需要实现spring的AOP接口——org.aspectj.lang.annotation.Aspect,同时需要使用注解来标识切面的类型和具体的切点。
@Aspect
@Component
public class LogAspect {
@Pointcut("execution(* com.example.service.UserService.addUser(..))")
public void addUserPointcut() {}
@Before("addUserPointcut()")
public void beforeAddUser() {
System.out.println("开始添加用户信息...");
}
@After("addUserPointcut()")
public void afterAddUser() {
System.out.println("用户信息添加完成。");
}
}
上述代码中,我们定义了一个切点addUserPointcut,它表示所有执行UserService的addUser方法的连接点。同时,我们在切面类中定义了两个通知方法——beforeAddUser和afterAddUser,它们分别表示在addUser方法执行前和执行后需要做的操作。
- 配置AOP
接下来,我们需要在spring配置文件中配置AOP。我们需要声明切面类和切点,并使用aop:aspectj-autoproxy标签来开启自动代理。
<bean id="logAspect" class="com.example.aop.LogAspect"/>
<aop:config>
<aop:aspect ref="logAspect">
<aop:pointcut id="addUserPointcut" expression="execution(* com.example.service.UserService.addUser(..))"/>
<aop:before pointcut-ref="addUserPointcut" method="beforeAddUser"/>
<aop:after pointcut-ref="addUserPointcut" method="afterAddUser"/>
</aop:aspect>
</aop:config>
<aop:aspectj-autoproxy/>
上述代码中,我们首先定义了切面类logAspect,并将其声明为spring的bean。接下来,我们使用aop:config标签进行AOP配置。在此标签中,我们声明了一个切点addUserPointcut,并将其绑定到logAspect切面类上。然后,我们使用aop:before和aop:after标签来分别指定在addUserPointcut连接点执行前和执行后需要调用的方法。
最后,我们使用aop:aspectj-autoproxy标签来开启自动代理,以便让spring自动创建代理对象并应用切面。
- 测试
现在,我们可以编写一个测试类来测试AOP的效果。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring-config.xml")
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void testAddUser() {
User user = new User();
user.setId(1);
user.setName("张三");
userService.addUser(user);
}
}
上述代码中,我们使用spring的测试框架来运行测试,并使用@ContextConfiguration注解来指定spring配置文件的路径。在测试方法中,我们调用UserService的addUser方法来添加一个用户,这时切面类中的通知方法会被自动调用,打印日志信息。
完整的示例代码可以参考以下链接:https://github.com/linjiajian999/Spring-AOP-Demo
原文地址: https://www.cveoy.top/t/topic/bCFM 著作权归作者所有。请勿转载和采集!