我想在不修改原对象代码的情况下,插入对域模型的数据搜集方法,需要传入1个参数。
例如:病人信息(PatientInfo)与病人信息操作日志(PatientInfoOperationLog),二者存在一对多的关系。
ORM映射配置中采用了级联,病人信息操作日志为被动插入操作。
在CreatePatientAction中采集病人信息的数据,并对病人信息执行显式的save。
这样看来,病人信息操作日志的信息与Action并没有什么关联,可以视为独立运作单元;而且,如果以后不打算采用这个日志的时候,可以修改配置直接修改或删除AOP和ORM映射配置就可以了。
前段时间考虑过spring是否可以注入方法,经过讨论发现是不可行的。这样我打算使用AOP,但我尝试了AOP配置,在没有传递参数的情况下,可以正常执行通知。但我需要配置2个对象之间的关系,不得不传入病人信息作为参数来完成任务,但不知道怎么配置这个参数。我尝试过加入arg-names属性,但服务器启动时就报错,没加这个属性也会报错,因为通知调用的方法是有参数的。而且还有个疑问,这个参数是否可以是一个已经实例化的引用?我需要的是这个引用,而不能是新创建的对象,因为这没有意义。我的配置如下,这里是没有加arg-names属性:
<aop:config>
    <aop:pointcut id="createPatient" expression="execution(* patient.base.action.CreatePatientAction.execute(..)) " />
    <aop:aspect id="patientInfoLogPluginAspect" ref="patientInfoLogPlugin">
        <aop:before pointcut-ref="createPatient" method="plugin" />
    </aop:aspect>
</aop:config>
<bean id="patientInfoLogPlugin" class="patient.base.action.assit.PatientInfoOpeLogPlugin" />PatientInfoOpeLogPlugin类代码如下:public void plugin(PatientInfo patientInfo){

log.setOperation(defaultOperation);
log.setOperateTime(this.now());
log.setOperator("admin");
log.setPatientInfo(patientInfo);
Set<PatientInfoOperationLog> logSet= new HashSet<PatientInfoOperationLog>();
logSet.add(log);
patientInfo.setOperationLog(logSet);

}服务器启动错误概要信息如下:
有没有配置arg-names的情况都一样:
…… Constructor threw exception; nested exception is java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut 
……

解决方案 »

  1.   

    你可以在public void plugin()中加入一个JoinPoint类型参数,可以获得需要代理方法的参数
    不需要配置文件。 public void CheckLogin(JoinPoint joinPoint){
    Object[] args = joinPoint.getArgs();
    for(int i= 0 ;i<args.length;i++){
    System.out.println(args[i]);
    }
    System.out.println(joinPoint.getSignature().getName());
    System.out.println("--------------CheckLogin--------------");
    }
    这个是我以前学的时候做的一个实验,不知道是不是符合你的意思
      

  2.   

    谢谢楼上的回复。只是我设计的切入点在execute方法,没有我想要的参数。
    那个joinPoint.getArgs()是不是获取切入点函数的参数?如果是,我会去尝试一下你的方法,新增一个函数做切入点,在这个函数内增加我想要的参数。
    不过这样就必须修改原来的对象了,违背了我原来想要的效果:在不修改原有代码的基础上。
    呵呵,希望能有更合适的办法。