0
点赞
收藏
分享

微信扫一扫

Spring - AOP之探秘


Spring - AOP之探秘_动态代理Spring - AOP之探秘_责任链模式_02Spring - AOP之探秘_责任链模式_03

Spring - AOP之探秘_JDK_04Spring - AOP之探秘_JDK_05Spring - AOP之探秘_动态代理_06Spring - AOP之探秘_责任链模式_07Spring - AOP之探秘_JDK_08Spring - AOP之探秘_Spring_09Spring - AOP之探秘_Spring_10Spring - AOP之探秘_责任链模式_11Spring - AOP之探秘_JDK_12Spring - AOP之探秘_Spring_13Spring - AOP之探秘_动态代理_14Spring - AOP之探秘_动态代理_15Spring - AOP之探秘_JDK_16

Spring - AOP之探秘_AOP_17Spring - AOP之探秘_责任链模式_18Spring - AOP之探秘_Spring_19Spring - AOP之探秘_Spring_20Spring - AOP之探秘_责任链模式_21Spring - AOP之探秘_责任链模式_18Spring - AOP之探秘_JDK_23Spring - AOP之探秘_动态代理_24

Spring - AOP之探秘_责任链模式_25

Spring - AOP之探秘_AOP_26


Spring - AOP之探秘_动态代理_27Spring - AOP之探秘_JDK_28Spring - AOP之探秘_JDK_29Spring - AOP之探秘_JDK_30Spring - AOP之探秘_JDK_31Spring - AOP之探秘_JDK_32

Spring - AOP之探秘_AOP_33

Spring - AOP之探秘_AOP_34

Spring - AOP之探秘_JDK_35

Spring - AOP之探秘_JDK_36

Spring - AOP之探秘_动态代理_37Spring - AOP之探秘_AOP_38

经典的无法拦截内部方法调用案例:

package com.imooc.service;

import com.imooc.config.ApplicationContextHolder;
import org.springframework.aop.framework.AopContext;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;

@Component
public class MenuService {

@Cacheable(cacheNames = {"menu"})
public List<String> getMenuList(){
System.out.println("");
System.out.println("mock:get from db");
return Arrays.asList("article","comment","admin");
}

public List<String> getRecommends(){
return this.getMenuList();
}
}

Ps:不会启动AOP: 因为是通过 this 调用,哪怕该方法上有切面注解,但获取不到Bean的原因,所以注解也会失效。

解决方案:通过代理来调用该方法,而不是通过 this 来调用。

package com.imooc.service;

import com.imooc.config.ApplicationContextHolder;
import org.springframework.aop.framework.AopContext;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;

@Component
public class MenuService {

@Cacheable(cacheNames = {"menu"})
public List<String> getMenuList(){
System.out.println("");
System.out.println("mock:get from db");
return Arrays.asList("article","comment","admin");
}

public List<String> getRecommends(){
MenuService proxy = ApplicationContextHolder.getContext().getBean(MenuService.class);
return proxy.getMenuList();
}
}
package com.imooc.config;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class ApplicationContextHolder implements ApplicationContextAware {

private static ApplicationContext ctx;

public static ApplicationContext getContext() {
return ctx;
}

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ctx = applicationContext;
}
}


  • 源码下载地址​​SpringAOP之探秘(动态代理、责任链模式、注解使用)_spring责任链模式,责任链注解-Java代码类资源-CSDN下载​​



举报

相关推荐

0 条评论