java নির্দিষ্ট টীকা সহ একটি ক্লাসের সমস্ত পদ্ধতির জন্য @ApectpectJ পয়েন্টক্যাট



aop aspectj (8)

এটি আপনার দৃষ্টিভঙ্গি পদ্ধতিটিকে চিহ্নিত করতে যথেষ্ট হওয়া উচিত:

@After("@annotation(com.marcot.CommitTransaction)")
    public void after() {

this একটি ধাপে ধাপে গাইড জন্য this একটি চেহারা আছে।

আমি নির্দিষ্ট টীকা সহ সকল ক্লাসের সমস্ত পাবলিক পদ্ধতি নিরীক্ষণ করতে চাই (বলুন @ মনিটর) (নোট: ভাষ্য শ্রেণী পর্যায়ে রয়েছে)। এই জন্য একটি সম্ভাব্য বিন্দু হতে পারে কি? দ্রষ্টব্য: আমি @ApectpectJ স্টাইল স্প্রিং AOP ব্যবহার করছি।


এরকম কিছু:

@Before("execution(* com.yourpackage..*.*(..))")
public void monitor(JoinPoint jp) {
    if (jp.getTarget().getClass().isAnnotationPresent(Monitor.class)) {
       // perform the monitoring actions
    }
}

উল্লেখ্য, আপনার আগে এই ক্লাসটিতে অন্য কোনও পরামর্শ নেই, কারণ প্রক্সিংয়ের পরে টীকাগুলি হারিয়ে যাবে।


প্রশ্নের বর্ণনা হিসাবে, টীকা ব্যবহার করে।

@Monitor : @Monitor

বর্গ, app/PagesController.java উপর app/PagesController.java :

package app;
@Controller
@Monitor
public class PagesController {
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public @ResponseBody String home() {
        return "w00t!";
    }
}

পদ্ধতি, app/PagesController.java উপর টীকা:

package app;
@Controller
public class PagesController {
    @Monitor
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public @ResponseBody String home() {
        return "w00t!";
    }
}

কাস্টম টীকা, app/Monitor.java :

package app;
@Component
@Target(value = {ElementType.METHOD, ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Monitor {
}

টীকা জন্য app/MonitorAspect.java , app/MonitorAspect.java :

package app;
@Component
@Aspect
public class MonitorAspect {
    @Before(value = "@within(app.Monitor) || @annotation(app.Monitor)")
    public void before(JoinPoint joinPoint) throws Throwable {
        LogFactory.getLog(MonitorAspect.class).info("monitor.before, class: " + joinPoint.getSignature().getDeclaringType().getSimpleName() + ", method: " + joinPoint.getSignature().getName());
    }

    @After(value = "@within(app.Monitor) || @annotation(app.Monitor)")
    public void after(JoinPoint joinPoint) throws Throwable {
        LogFactory.getLog(MonitorAspect.class).info("monitor.after, class: " + joinPoint.getSignature().getDeclaringType().getSimpleName() + ", method: " + joinPoint.getSignature().getName());
    }
}

AspectJ, servlet-context.xml context.xml সক্ষম করুন:

<aop:aspectj-autoproxy />

AspectJ লাইব্রেরি অন্তর্ভুক্ত করুন, pom.xml :

<artifactId>spring-aop</artifactId>
<artifactId>aspectjrt</artifactId>
<artifactId>aspectjweaver</artifactId>
<artifactId>cglib</artifactId>

আপনি স্প্রিং এর পারফরম্যান্স মনিটরিং ইন্টারফেসার ব্যবহার করতে পারেন এবং প্রোগ্রামপ্যাটিকভাবে একটি বীনপস্টপ্রক্সেসার ব্যবহার করে পরামর্শ নিবন্ধন করতে পারেন।

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Monitorable
{

}


public class PerformanceMonitorBeanPostProcessor extends ProxyConfig implements BeanPostProcessor, BeanClassLoaderAware, Ordered,
    InitializingBean
{

  private Class<? extends Annotation> annotationType = Monitorable.class;

  private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader();

  private Advisor advisor;

  public void setBeanClassLoader(ClassLoader classLoader)
  {
    this.beanClassLoader = classLoader;
  }

  public int getOrder()
  {
    return LOWEST_PRECEDENCE;
  }

  public void afterPropertiesSet()
  {
    Pointcut pointcut = new AnnotationMatchingPointcut(this.annotationType, true);
    Advice advice = getInterceptor();
    this.advisor = new DefaultPointcutAdvisor(pointcut, advice);
  }

  private Advice getInterceptor()
  {
    return new PerformanceMonitoringInterceptor();
  }

  public Object postProcessBeforeInitialization(Object bean, String beanName)
  {
    return bean;
  }

  public Object postProcessAfterInitialization(Object bean, String beanName)
  {
    if(bean instanceof AopInfrastructureBean)
    {
      return bean;
    }
    Class<?> targetClass = AopUtils.getTargetClass(bean);
    if(AopUtils.canApply(this.advisor, targetClass))
    {
      if(bean instanceof Advised)
      {
        ((Advised)bean).addAdvisor(this.advisor);
        return bean;
      }
      else
      {
        ProxyFactory proxyFactory = new ProxyFactory(bean);
        proxyFactory.copyFrom(this);
        proxyFactory.addAdvisor(this.advisor);
        return proxyFactory.getProxy(this.beanClassLoader);
      }
    }
    else
    {
      return bean;
    }
  }
}

স্প্রিং এর AnnotationTransactionAspect থেকে AnnotationTransactionAspect :

/**
 * Matches the execution of any public method in a type with the Transactional
 * annotation, or any subtype of a type with the Transactional annotation.
 */
private pointcut executionOfAnyPublicMethodInAtTransactionalType() :
    execution(public * ((@Transactional *)+).*(..)) && within(@Transactional *);

আপনি হিসাবে বিন্দু নির্ধারণ করতে পারেন

public pointcut publicMethodInsideAClassMarkedWithAtMonitor() : execution(public * (@Monitor *).*(..));

আপনি একটি পদ্ধতি পয়েন্টক সঙ্গে একটি টাইপ বিন্দু একত্রিত করা উচিত।

এই পয়েন্টকগুলি একটি @ মনিটর টীকা সম্বলিত একটি ক্লাসের ভিতরে সমস্ত পাবলিক পদ্ধতিগুলি খুঁজতে কাজটি করবে:

@Pointcut("within(@org.rejeev.Monitor *)")
public void beanAnnotatedWithMonitor() {}

@Pointcut("execution(public * *(..))")
public void publicMethod() {}

@Pointcut("publicMethod() && beanAnnotatedWithMonitor()")
public void publicMethodInsideAClassMarkedWithAtMonitor() {}

প্রথম দুইটি সংযুক্ত করে শেষ বিন্দুতে পরামর্শ করুন এবং আপনি সম্পন্ন করেছেন!

আপনি যদি আগ্রহী হন, তবে আমি এখানে একটি উদাহরণ উদাহরণ দিয়ে এখানে @AspectJ শৈলী নিয়ে একটি প্রতারণার পত্র লিখেছি।


সহজ উপায় মনে হচ্ছে:

@Around("execution(@MyHandling * com.exemple.YourService.*(..))")
public Object aroundServiceMethodAdvice(final ProceedingJoinPoint pjp)
   throws Throwable {
   // perform actions before

   return pjp.proceed();

   // perform actions after
}

এটি 'YourService' শ্রেণিতে '@ মাইহ্যান্ডলিং' এর সাথে বিশেষভাবে উল্লেখিত সমস্ত পদ্ধতিগুলির নির্বাহকে আটকাবে। ব্যতিক্রম ব্যতীত সকল পদ্ধতিতে বাধা দেওয়ার জন্য, কেবল বর্গের উপর সরাসরি বক্তব্য রাখুন।

এখানে ব্যক্তিগত / সরকারী সুযোগের কোন ব্যাপার নেই, তবে মনে রাখবেন যে বসন্ত-অপ একই ক্ষেত্রে (সাধারণত ব্যক্তিগত ব্যক্তিদের) পদ্ধতি কলগুলির জন্য দৃষ্টিভঙ্গি ব্যবহার করতে পারে না, কারণ এটি এই ক্ষেত্রে প্রক্সি ক্লাস ব্যবহার করে না।

আমরা এখানে প্রায় @ পরামর্শ ব্যবহার করি, তবে এটি মূলত @ বায়রোর @ @ বা কোনও পরামর্শের সাথে একই সিনট্যাক্স।

যাইহোক, @ মাইহ্যান্ডলিং টীকাটি এইভাবে কনফিগার করা আবশ্যক:

@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.METHOD, ElementType.TYPE })
public @interface MyHandling {

}