通過@Before @After @Around都注解,我們為對象原有的方法添加上了新的功能。那么,我們能不能為對象添加新的方法呢?通過 @DeclareParents ,答案是肯定的。
定義一個 Person 的空類及其子類 Student
@Component public class Person { } @Component public class Student extends Person { public void sayIdentification(){ System.out.println("我是學生。"); } }
定義一個名為 Skill 的接口及它的實現類 SkillImpl。我們將要把 SkillImpl 的getSkill()方法添加到其他的類實例
@Component public interface Skill { void getSkill(String skill); }
@Component public class SkillImpl implements Skill { @Override public void getSkill(String skill) { System.out.println(skill); } }
SpringAop 配置類
@Component @Aspect public class AopConfig { // “...aop.Person”后面的 “+” 號,表示只要是Person及其子類都可以添加新的方法 @DeclareParents(value = "com.san.spring.aop.Person+", defaultImpl = SkillImpl.class) public Skill skill; }
SpringConfig 配置類
@ComponentScan @Configuration @EnableAspectJAutoProxy public class SpringConfig { }
Test
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = SpringConfig.class) public class AopTest { @Autowired private Student student; @Test public void test(){ Skill skill = (Skill)student; // 通過類型轉換,student對象就擁有了SkillImp 類的方法 skill.getSkill("我會英語"); student.sayIdentification(); } }