Пружина АОП внутри pointcut

package com.vanilla.daoService;

    @Repository("daoService")
    public class DaoServiceImpl implements DaoService {

        @Override
        public String addStudent(Student student) {
            //saving new user
             }

        @Override
        public String updateStudent(Student student) {
            //update new user
             }

        @Override
        public String getStudent(String id) {
            //update new user
             }
    }

мой класс бизнес-логики:

package com.vanilla.blService;

@Service("blService") 
public class BlServiceImpl implements BlService {

    @Autowired
    DaoService daoService;

@Override
public void updateStudent(String id){
   Student s = daoService.getStudent(id);
   set.setAddress(address);
   daoService.updateStudent(s);
}

}

Теперь я хотел бы измерить выполнение всех методов, выполняемых в каждой из функций бизнес-логики (daoservice. *)

Я создаю свои классы Аспекта

@Aspect
public class BlServiceProfiler {

    @Pointcut("within(com.vanilla.blService.BlService.*)")
    public void businessLogicMethods(){}

      @Around("businessLogicMethods()")
      public Object profile(ProceedingJoinPoint pjp) throws Throwable {
          long start = System.currentTimeMillis();
          System.out.println("Going to call the method " + pjp.toShortString());
          Object output = pjp.proceed();
          System.out.println("Method execution completed.");
          long elapsedTime = System.currentTimeMillis() - start;
          System.out.println(pjp.toShortString()+" execution time: " + elapsedTime + " milliseconds.");
          return output;
      }

}

К сожалению, ничего не произошло. Я считаю, что мое @PointCut определение неверно, как я могу сделать это правильно?


person danny.lesnik    schedule 29.07.2011    source источник
comment
Вы зарегистрировали аспект с помощью Spring? (Просто проверка...)   -  person Sean Patrick Floyd    schedule 29.07.2011


Ответы (3)


Вы, наверное, захотите этого:

@Pointcut("within(com.vanilla.blService.BlService+)")
public void businessLogicMethods(){}

BlService+ означает BlService и все подклассы / реализующие классы.

person Sean Patrick Floyd    schedule 29.07.2011
comment
Я протестировал его, и похоже, что он применен к BlService.updateStudent вместо методов daoService, потому что он печатает Собираюсь вызвать выполнение метода (BlService.updateStudent (..)) - person danny.lesnik; 29.07.2011
comment
Если вы хотите, чтобы он применялся к DAO, измените его на within(com.vanilla.daoService.DaoService+). В вашем вопросе говорится, что вы хотите указать DAO, но ваш образец кода подразумевает, что вы пытаетесь использовать сервисы pointcut, это немного сбивает с толку. - person Niall Thomson; 29.07.2011
comment
@Niall, так в чем разница между @Pointcut (внутри (com.vanilla.blService.BlService +)), @Pointcut (внутри (com.vanilla.blService.BlService. *)) И @Pointcut (выполнить (* com.vanilla .blService.BlService. * (..))) все они имеют одинаковый результат? - person danny.lesnik; 30.07.2011
comment
В этом случае они дадут тот же результат, потому что так уж получилось, что будет перекрытие, т.е. Все ваши услуги находятся в одном пакете И все расширяют BIService. Я просто указывал, что в ваших исходных вопросах говорится, что вы хотите указать все в пакете daoservice, но все ваши pointcuts ссылаются на пакет blservice. - person Niall Thomson; 01.08.2011

Вы должны использовать приведенный ниже pointcut

@Pointcut("execution(* com.vanilla.blService.BlService.*(..))")
person user1175569    schedule 27.05.2012

Попробуй использовать:

within(com.vanilla.blService.BlService) && execution(public * com.vanilla.daoService..*.*(..))
person Constantiner    schedule 29.07.2011
comment
Я получаю: вложенное исключение - org.aspectj.weaver.tools.UnsupportedPointcutPrimitiveException: выражение Pointcut 'businessLogicMethods ()' содержит неподдерживаемый примитив pointcut 'call' - person danny.lesnik; 29.07.2011
comment
Извините меня. Я забыл, что call не поддерживается в @AspectJ весной. Попробуйте использовать execution, как в фиксированном коде. - person Constantiner; 29.07.2011
comment
К сожалению, он не выполняется, похоже, отсутствует pointCut. - person danny.lesnik; 29.07.2011