spring基于注解配置aop案例
spring基于注解配置aop案例
1、导入jar包
- 基于maven项目
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.14</version>
</dependency>
2、编写实体类
package com.yl.bean;
import java.io.Serializable;
/**
* 用户实体类
*/
public class User implements Serializable {
private Integer id;
private String username;
private String password;
public User() {
}
public User(Integer id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
3、编写业务层
- 业务层接口
package com.yl.service;
/**
* 用户业务层接口
*/
public interface IUserService {
/**
* 查询用户
*/
public void queryUser();
}
- 业务层接口实现类
package com.yl.service.impl;
import com.yl.dao.IUserDao;
import com.yl.service.IUserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* 用户业务层接口实现类
*/
@Service("userService")
public class IUserServiceImpl implements IUserService {
@Resource(name = "userDao")
private IUserDao iUserDao;//用户持久层对象
/**
* 查询用户
*/
@Override
public void queryUser() {
// int i=1/0;
iUserDao.queryUser();
}
}
4、编写持久层
- 持久层接口
package com.yl.dao;
/**
* 用户持久层接口
*/
public interface IUserDao {
/**
* 查询用户
*/
public void queryUser();
}
- 持久层接口实现类
package com.yl.dao.impl;
import com.yl.dao.IUserDao;
import org.springframework.stereotype.Repository;
/**
* 用户持久层接口实现类
*/
@Repository("userDao")
public class IUserDaoImpl implements IUserDao {
/**
* 查询用户
*/
@Override
public void queryUser() {
System.out.println("查询成功");
}
}
5、编写通知类
package com.yl.inform;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
/**
* spring通知类
*/
@Component("userInform")
@Aspect//指定当前类为切面
public class UserInform {
/**
*配置通用切入点
*/
@Pointcut("execution(* com.yl.service.impl.IUserServiceImpl.*())")
private void pt1(){}
/**
* 前置通知
*/
@Before("pt1()")
public void beforeInform(){
System.out.println("开启事务");
}
/**
* 后置通知
*/
@AfterReturning("execution(* com.yl.service.impl.IUserServiceImpl.*())")
public void afterInform(){
System.out.println("提交事务");
}
/**
* 异常通知
*/
@AfterThrowing("execution(* com.yl.service.impl.IUserServiceImpl.*())")
public void throwInform(){
System.out.println("异常通知");
}
/**
* 环绕通知
*/
/*public void aroundInform(ProceedingJoinPoint pjp){
System.out.println("前置通知");
try {
pjp.proceed();
System.out.println("后置通知");
} catch (Throwable throwable) {
System.out.println("异常通知");
}finally {
System.out.println("最终通知");
}
}*/
}
6、配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--指定spring要扫描的包-->
<context:component-scan base-package="com.yl"></context:component-scan>
<!--开启spring对注解aop的支持-->
<aop:aspectj-autoproxy/>
</beans>
7、测试
package com.yl.ui;
import com.yl.service.IUserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 测试类
*/
public class MainTest {
public static void main(String[] args) {
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml");
IUserService userService= (IUserService) applicationContext.getBean("userService");
userService.queryUser();
}
}
8、不使用xml方式
用配置类替代xml配置文件
@Configuration
@ComponentScan(basePackages="com.itheima")
@EnableAspectJAutoProxy
public class SpringConfiguration {
}
记得快乐
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!