给出一组由spring连接在一起的类。在环境中的多个实例中,有几个类用于不同的配置。他们当然有不同的beanid。
问题:
解决方案可能是:
问题:
提前致谢。
更新: - 有没有人有原型豆的解决方案?
答案 0 :(得分:5)
我已经设法根据this Spring AOP Example一起破解了一些东西。
我还没有达到Spring 3的速度,所以我使用Spring 2.5实现了这一点 - 我敢说有更优雅的方式来实现你想要的。为简单起见,我使用 System.out 实现了这一点,但这些可以很容易地转换为log4j调用。
最初,我在Spring的bean名称和对象的字符串表示形式( InitBean )之间创建了一个映射。此映射在 MethodInterceptor 中使用 - 我尝试使 MethodInterceptor 成为 InitializingBean ,但 MethodInterceptor 已停止工作某种原因。
通过 MethodInterceptor 传入的bean与应用程序上下文中的其他bean之间执行等于不起作用。例如在 MethodInterceptor 中使用类似“ ctx.getBeansOfType(GoBean.class) ”的内容。我认为这是因为通过 MethodInvocation 传入的对象是 GoBean ,而此时从应用程序上下文获取的对象是代理的(例如 example.GoBean $$ EnhancerByCGLIB $$ bd27d40e 强>)。
这就是为什么我不得不求助于对象字符串表示的比较(这是不理想的)。另外,我特别不想在对象上调用“ toString ”方法时激活 MethodInterceptor 逻辑(因为我使用toString)其他地方导致无限循环和StackOverflow)。
我希望这很有用,
<强>的applicationContext.xml 强>
<beans>
<bean name="initBean" class="example.InitBean"/>
<bean name="methodLoggingInterceptor" class="example.MethodLoggingInterceptor">
<property name="initBean" ref="initBean"/>
</bean>
<bean name="proxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>go*</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>methodLoggingInterceptor</value>
</list>
</property>
</bean>
<bean name="goBean1" class="example.GoBean" />
<bean name="goBean2" class="example.GoBean" />
<bean name="goBean3" class="example.GoBean" />
</beans>
<强> GoBean.java 强>
public class GoBean {
public void execute(){
System.out.println(new Date());
}
}
<强> SimpleTestClass.java 强>
public static void main( String[] args ){
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
ArrayList<GoBean> goBeans = new ArrayList<GoBean>();
goBeans.add((GoBean) ctx.getBean("goBean1"));
goBeans.add((GoBean) ctx.getBean("goBean2"));
goBeans.add((GoBean) ctx.getBean("goBean3"));
for(GoBean g: goBeans){
g.execute();
}
}
<强> InitBean.java 强>
public class InitBean implements ApplicationContextAware, InitializingBean {
private ApplicationContext ctx;
private Map<String, String> beanMap = new HashMap<String,String>();
public void setApplicationContext(ApplicationContext ac) throws BeansException {
ctx = ac;
}
public void afterPropertiesSet() throws Exception {
for(String beanName: ctx.getBeanNamesForType(GoBean.class)){
beanMap.put(ctx.getBean(beanName).toString(), beanName);
}
}
public Map<String,String> getBeanMap(){
return beanMap;
}
}
<强> MethodLoggingInterceptor.java 强>
public class MethodLoggingInterceptor implements MethodInterceptor{
private InitBean initBean;
public Object invoke(MethodInvocation method) throws Throwable {
if (!"toString".equals(method.getMethod().getName())) {
StringBuilder sb = new StringBuilder();
Object obj = method.getThis();
if (obj instanceof GoBean) {
Map<String,String> beanMap = initBean.getBeanMap();
String objToString = obj.toString();
if (beanMap.containsKey(objToString)) {
System.out.println(beanMap.get(objToString));
sb.append("bean: ");
sb.append(beanMap.get(objToString));
sb.append(" : ");
}
}
sb.append(method.getMethod().getDeclaringClass());
sb.append('.');
sb.append(method.getMethod().getName());
System.out.println(sb.toString() + " starts");
Object result = method.proceed();
System.out.println(sb.toString() + " finished");
return result;
} else {
return method.proceed();
}
}
public void setInitBean(InitBean ib) {
this.initBean = ib;
}
}