一:应用背景
在看此文章前,你可能已经知道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
你看,是否通过代理实现了原目标类和新添加的类中的目标方法。