AspectJ之@DeclareParents注解为对象添加新方法
眾所周知,AspectJ可以通過(guò)@Before,@After,@Around等注解對(duì)連接點(diǎn)進(jìn)行增強(qiáng),今天我們來(lái)玩一個(gè)新注解@DeclareParents。對(duì)目標(biāo)對(duì)象增強(qiáng)一個(gè)新方法。
- 場(chǎng)景引入:
現(xiàn)在我們有一個(gè)動(dòng)物鴨子類,它有個(gè)游泳的函數(shù),但是突然有一天我們需要給動(dòng)物鴨子實(shí)現(xiàn)一個(gè)很好吃的食材屬性。我們當(dāng)然可以去動(dòng)物鴨子類去新增一個(gè)方法,但是違背了單一原則。我們可以通過(guò)AOP來(lái)實(shí)現(xiàn)增強(qiáng)。
- Code show time
有一個(gè)Animal的接口
public interface Animal {
void swim();
}
再來(lái)一個(gè)動(dòng)物鴨子的實(shí)現(xiàn)類
@Repository("animal")
public class DuckAnimal implements Animal{
@Override
public void swim() {
System.out.println("鴨子喜歡游泳。。。");
}
}
需要一個(gè)增強(qiáng)方法,實(shí)現(xiàn)鴨子是一種美味的食物
public interface Food {
void eat();
}
@Repository("food")
public class DuckFood implements Food{
@Override
public void eat() {
System.out.println("鴨子看起來(lái)很好吃。。。");
}
}
采用自動(dòng)注入
@ComponentScan("com.zjt.springboot.DeclareParents")
@Configuration
@EnableAspectJAutoProxy
public class AppConfiguration {
}
聲明一個(gè)切面
@Aspect
@Component
public class MyAspect { /**
* com.zjt.springboot.DeclareParents.Animal+ 表示增強(qiáng)Animal的所有子類
*
*defaultImpl=DuckFood.class 表示默認(rèn)需要添加的新類
*/
@DeclareParents(value="com.zjt.springboot.DeclareParents.Animal+", defaultImpl=DuckFood.class)
public static Food food;
}
接下來(lái)就是緊張刺激的測(cè)試環(huán)節(jié)了:
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(AppConfiguration.class);
Animal animal = (Animal)context.getBean("animal");
animal.swim();
Food food = (Food)animal;
food.eat();
}
}
測(cè)試結(jié)果:
鴨子喜歡游泳。。。
鴨子看起來(lái)很好吃。。。
結(jié)論:從測(cè)試結(jié)果我們發(fā)現(xiàn),只從容器里獲取了一個(gè)動(dòng)物鴨子,卻可以得到食材的功能,實(shí)現(xiàn)了增強(qiáng)功能!
總結(jié)
以上是生活随笔為你收集整理的AspectJ之@DeclareParents注解为对象添加新方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Delphi ResourceStrin
- 下一篇: python基本知识点if、while、