系统相关
首页 > 系统相关> > Spring高级注解-Day3,linux系统架构与目录解析pdf

Spring高级注解-Day3,linux系统架构与目录解析pdf

作者:互联网

}

@Override

public void saveAllUser(List users) {

for (User user : users) {

UserService proxyUserServiceImpl = (UserService) AopContext.currentProxy();

proxyUserServiceImpl.saveUser(user);

}

}

}

UserServiceImpl.java

@Component

//表明当前类是一个切面类

@Aspect

public class LogUtil {

//用于配置当前方法是一个前置通知

@Before(“execution(* com.example.service.impl.*.saveUser(…))”)

public void printLog(){

System.out.println(“打印日志”);

}

}

LogUtil.java

@Configuration

@ComponentScan(“com.example”)

//开启Spring注解aop配置的支持

@EnableAspectJAutoProxy(exposeProxy = true)

public class SpringConfiguration {

}

SpringConfiguration

4.2 用于配置切面的

4.2.1 @Aspect

4.2.1.1 作用
4.2.1.2 属性
4.2.1.3 基本使用

@Component

//表明当前类是一个切面类

@Aspect(“perthis(execution(* com.example.service.impl..(…)))”)

@Scope(“prototype”)

public class LogUtil {

//用于配置当前方法是一个前置通知

@Before(“execution(* com.example.service.impl..(…))”)

public void printLog(){

System.out.println(“打印日志”);

}

}

LogUtil.java

@Component

//表明当前类是一个切面类

@Aspect

public class LogUtil {

//用于配置当前方法是一个前置通知

@Before(“execution(* com.example.service.impl..(…))”)

public void printLog(){

System.out.println(“打印日志”);

}

}

LogUtil.java

@Component

@Aspect

public class EfficiencyUtils {

private Long time;

@Before(“execution(* com.example.service.impl..(…))”)

public void before() {

time = System.currentTimeMillis();

System.out.println(“方法执行开始时间:” + time);

}

@After(“execution(* com.example.service.impl..(…))”)

public void after() {

System.out.println(“方法执行时间:” + (System.currentTimeMillis() - time) / 1000);

}

}

EfficiencyUtils.java

4.3 用于配置切入点表达式的

4.3.1 @Pointcut

4.3.1.1 作用
4.3.1.2 属性
4.3.1.3 基本使用

@Component

//表明当前类是一个切面类

@Aspect

public class LogUtil {

//用于定义通用的切入点表达式

@Pointcut(value = “execution(* com.example.service.impl..(…)) && args(user)”,argNames = “user”)

private void pointcut1(User user){

}

//用于配置当前方法是一个前置通知

@Before(value = “pointcut1(user)”,argNames = “user”)

public void printLog(User user){

System.out.println(“打印日志” + user);

}

}

LogUtil.java

4.4 用于配置通知的

4.4.1 @Before

4.4.1.1 作用
4.4.1.2 属性

4.4.2 @AfterReturning

4.4.2.1 作用

需要注意的是,由于基于注解的配置时,spring创建通知方法的拦截器链时,后置

通知在最终通知之后,所以会先执行@After注解修饰的方法。

4.4.2.2 属性

4.4.3 @AfterThrowing

4.4.3.1 作用
4.4.3.2 属性

4.4.4 @After

4.4.4.1 作用
4.4.4.2 属性

4.4.5 基本使用

@Component

//表明当前类是一个切面类

@Aspect

public class LogUtil {

//用于配置当前方法是一个前置通知

@Before(“execution(* com.example.service.impl..(…))”)

public void beforePrintLog(){

System.out.println(“前置通知打印日志”);

}

//用于配置当前方法是一个最终通知

@After(“execution(* com.example.service.impl..(…))”)

public void afterPrintLog(){

System.out.println(“最终通知打印日志”);

}

//用于配置当前方法是一个后置通知

@AfterReturning(“execution(* com.example.service.impl..(…))”)

public void afterReturningPrintLog(){

System.out.println(“后置通知日志”);

}

//用于配置当前方法是一个异常通知

@AfterThrowing(“execution(* com.example.service.impl..(…))”)

public void afterThrowingPrintLog(){

System.out.println(“异常通知打印日志”);

}

}

LogUtil.java

前置通知打印日志

保存用户User{id=1, username=‘zs’, password=‘123’, birthday=Sat Jul 24 16:02:21 CST 2021}

后置通知日志

最终通知打印日志

4.4.6 一个切面内相同类型通知的执行顺序

@Component

//表明当前类是一个切面类

@Aspect

public class LogUtil {

//用于配置当前方法是一个前置通知

@Before(“execution(* com.example.service.impl..(…))”)

public void before2PrintLog(){

System.out.println(“前置通知2打印日志”);

}

//用于配置当前方法是一个前置通知

@Before(“execution(* com.example.service.impl..(…))”)

public void before1PrintLog(){

System.out.println(“前置通知1打印日志”);

}

}

前置通知1打印日志

前置通知2打印日志

保存用户User{id=1, username=‘zs’, password=‘123’, birthday=Sat Jul 24 16:20:17 CST 2021}

4.4.7 @Around

4.4.7.1 作用
4.4.7.2 属性
4.4.7.3 基本使用

public interface UserService {

@Description(“保存”)

void saveUser(User user);

@Description(“查找”)

User findById(String id);

@Description(“更新”)

void update(User user);

@Description(“删除”)

void delete(String id);

}

UserService.java

/**

*/

public class SystemLog implements Serializable {

//主键

private String id;

//方法名称

private String method;

//方法说明

private String action;

//时间

private Date time;

//来访者名称

private String remoteIp;

@Override

public String toString() {

return “SystemLog{” +

“id=’” + id + ‘’’ +

“, method=’” + method + ‘’’ +

“, action=’” + action + ‘’’ +

“, time=” + time +

“, remoteIp=’” + remoteIp + ‘’’ +

‘}’;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getMethod() {

return method;

}

public void setMethod(String method) {

this.method = method;

}

public String getAction() {

return action;

}

public void setAction(String action) {

this.action = action;

}

public Date getTime() {

return time;

}

public void setTime(Date time) {

this.time = time;

}

public String getRemoteIp() {

return remoteIp;

}

public void setRemoteIp(String remoteIp) {

this.remoteIp = remoteIp;

}

}

SystemLog.java

@Component

//表明当前类是一个切面类

@Aspect

public class LogUtil {

/**

*/

@Around(“execution(* com.example.service.impl..(…))”)

public Object aroundPrintLog(ProceedingJoinPoint pjp){

Object rtValue = null;

//创建系统日志对象

SystemLog log = new SystemLog();

try {

log.setId(UUID.randomUUID().toString());

log.setRemoteIp(“127.0.0.1”);

log.setTime(new Date());

//使用ProceedingJoinPoint中的获取签名方法

Signature signature = pjp.getSignature();

//判断当前的签名是否是方法签名

if(signature instanceof MethodSignature){

//把签名转换成方法签名

MethodSignature methodSignature = (MethodSignature) signature;

//获取当前执行的方法

Method method = methodSignature.getMethod();

log.setMethod(method.getName());

//判断当前方法上是否有@Description注解

boolean isAnnotated = method.isAnnotationPresent(Description.class);

if(isAnnotated){

//得到当前方法上的@Description

Description description = method.getAnnotation(Description.class);

//得到注解的value属性

String value = description.value();

log.setAction(value);

}

}

System.out.println(“环绕通知” + log);

Object[] args = pjp.getArgs();

//切入点方法执行

rtValue = pjp.proceed(args);

} catch (Throwable throwable) {

throwable.printStackTrace();

}

return rtValue;

}

}

LogUtil.java

4.5 用于扩展目标类的

4.5.1 @DeclareParents

4.5.1.1 作用
4.5.1.2 属性
4.5.1.3 基本使用

@Component

//表明当前类是一个切面类

@Aspect

public class LogUtil {

//让目标类具备当前声明接口中的方法,动态代理

@DeclareParents(value = “com.example.service.UserService+”,defaultImpl = ValidateExtensionServiceImpl.class)

private ValidateExtensionService validateExtensionService;

//用于配置当前方法是一个前置通知

@Before(“execution(* com.example.service.impl..(…))”)

public void printLog(){

System.out.println(“打印日志”);

}

}

LogUtil.java

@Component

public class ValidateExtensionServiceImpl implements ValidateExtensionService {

@Override

public boolean checkUser(User user) {

//校验不通过

if(user.getUsername().contains(“zs”)){

return false;

}

return true;

}

}

标签:4.4,Spring,切入点,Day3,void,通知,pdf,public,表达式
来源: https://blog.csdn.net/m0_64867588/article/details/121886015