一:应用背景

  在看此文章前,你可能已经知道spring是通过Before、After、AfterRunning、AfterThrowing、Around 共5中通知方式为目标方法增加切面功能。比如:执行目标类的一个目标方法前后需要分别打印日志,就可以建立一个切面在这个方法前后打印日志。但是如果我想在此目标类中再增加一个目标方法是,该怎么办呢? 最简单的办法就是在改目标类中增加此方法。但是如果原目标类非常复杂,动一发而牵全身。我们可以通过@DeclareParents注解实现该功能。下面通过代码来演示

二:代码实现

 

1.配置类

@Aspect
@Component
public class IntroductionAspect {
    //让com.lyz.report.service下的接口拥有 DoSthService的方法
    @DeclareParents(value = "com.lyz.report.service.*.*(..)", defaultImpl = Introduction1ServiceImpl.class)
    public Introduction1Service doSthService;
}

2.service代码

public interface Introduction1Service {
    void is();
}

@Service
public class Introduction1ServiceImpl implements Introduction1Service {
    @Override
    public void is() {
        System.out.println("我是 Introduction 1");
    }
}

public interface Introduction2Service {
    void is();
}

@Service
public class Introduction2ServiceImpl implements Introduction2Service {
    @Override
    public void is() {
        System.out.println("我是 Introduction 2");
    }
}

3.测试Controller

@RestController
@RequestMapping(value = "/report")
public class AspectController {

    @Autowired
    private Introduction2Service userService;

    @RequestMapping(value = "aspect", method = RequestMethod.POST)
    public void testIntroduction() {
        userService.is();
        Introduction1Service doSthService = (Introduction1Service) userService;
        doSthService.is();
    }
}

 4.访问结果:

我是 Introduction 2
我是 Introduction 2

你看,是否通过代理实现了原目标类和新添加的类中的目标方法。

12-25 06:14