AspectJ 导致切面Bean 被实例化2次,求解决方法

run_for_free 2019-08-11 07:12:36
今天照着《springAction4》练习aop,代码如下;但是在启动的时候发现 切面类都被实例化2次,通过 代码
Map<String, Show> beansOfType = applicationContext.getBeansOfType(Show.class)
获取的map是size为1.感觉多出来的那个是AspectJ框架干的事。查看反编译的class文件,发现多出来一些方法是ajc开头的。请问有什么办法可以避免这种情况吗?

private static /* synthetic */ void ajc$postClinit() {
AShow2.ajc$perSingletonInstance = new AShow2();
}


package com.springAction4.aop;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
* 演出类,aop练习1
*/
@Component
@Aspect
@Order(0)
public class Show {
Show(){
System.out.println("切面Show()实例化ok");
System.out.println(this.hashCode());
}

@Pointcut("execution(* com.springAction4.bean.Actor.*(..))")
public void shello() {
}

@Before(value = "shello()")
public void say1() {
System.out.println("演出要开始了");
}

@After(value = "shello()")
public void say2() {
System.out.println("演出要结束了");
}
}




package com.springAction4.bean;
/**
* 演员类,aop练习2,目标
*/
public class Actor {

public void name() {
System.out.println("演出开始,演员自我介绍: my name is Jack");
}

public void sing(int i ){
System.out.println("这是第"+i+"首歌曲,请欣赏!!");
}
}



package com.springAction4.aspectjAop;

import com.springAction4.bean.Worker;

/**
* AspectJ 的类 Au.aj
*/
public aspect Au {

private Worker worker;

public Au(){

}
//通过setter方法注入
public void setWorker(Worker worker){
this.worker = worker;
System.out.println("工作人员已入场");
}
// 定义 Actor 的 构造器 切点 和 后置通知
pointcut actor() : execution(* com.springAction4.bean.Speaker.Speaker() );
after():actor(){
worker.sendMsg("Speaker");
}
// 定义 Actor 的 name 切点 和 后置通知
pointcut name() : execution(* com.springAction4.bean.Speaker.name() );
after():name(){
worker.sendMsg("Speaker name");
}
// 定义 Actor 的 sing 切点 和 后置通知
/* pointcut sing() : execution(* com.springAction4.bean.Actor.sing(..) );
after():sing(){
worker.sendMsg("sing");
}*/


}




package com.springAction4.bean;

/**
* 切面的协作bean
*
*/
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);
}

}
[code=xml]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="worker" class="com.springAction4.bean.Worker"/>

<!--Spring需要通过静态方法aspectOf获得audience实例-->
<bean class="com.springAction4.aspectjAop.Au" factory-method="aspectOf">
<property name="worker" ref="worker" /><!--通过Spring把协作的bean注入到切面中-->
</bean>



</beans>

[/code]


package com.springAction4.bean;

public class Speaker {
public void name() {
System.out.println("自我介绍: my name is Jackson");
}
}


...全文
124 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
run_for_free 2019-08-12
  • 打赏
  • 举报
回复
https://www.cnblogs.com/foreveravalon/p/8653832.html 参考此贴, 是new 了一个对象来作为key,这样就解释的通。 具体的后面慢慢学习吧。如果不是这个原因,还请各位大佬指点我。
run_for_free 2019-08-11
  • 打赏
  • 举报
回复
我这里是切面Bean实例化2次,但是方法都是执行一次,就是感觉多出来一个bean 很浪费。希望解决这个问题。

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧