写在开头:
本文参考资料为Spring In Action(第4版),文中理解不对之处均为本人原因,与书籍无关。
Spring In Action中提到:“Spring AOP构建在动态代理之上,因此,Spring对AOP的支持局限于方法拦截”。
那么,当我们需要创建更细粒度的通知或想监测bean的创建时,Spring所支持的AOP就比较弱了,这时,可以选择使用AspectJ提供的构造器切点,并且可以借助Spring的依赖注入把bean装配进AspectJ切面中。下面就来举个栗子:
//定义表演接口
package concert;
public interface Performance {
void perform();
void finishPerform(String performer, String title);
}
//定义钢琴表演
package concert;
public class PianoPerform implements Performance {
public PianoPerform(){
System.out.println("有请钢琴表演");
}
@Override
public void perform() {
System.out.println("钢琴表演开始");
}
@Override
public void finishPerform(String performer, String title) {
System.out.println(performer + "演奏钢琴曲:" + title);
}
}
//定义小提琴表演
package concert;
public class ViolinPerform implements Performance {
public ViolinPerform(){
System.out.println("有请小提琴表演");
}
@Override
public void perform() {
System.out.println("小提琴表演开始");
}
@Override
public void finishPerform(String performer, String title){
System.out.println(performer + "演奏了小提琴曲:" + title);
}
}
//定义工作人员,将作为切面的协作bean
package concert;
public class Worker {
public void take(){
System.out.println("观众已全部交出手机");
}
public void sendMsg(String name){
System.out.println(name + "表演即将开始,请各位观众交出手机");
}
public void broadcast(String performer, String title){
System.out.println(performer + "演奏完毕,刚才演奏的曲子叫:" + title);
}
}