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




aop aspectj (6)

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


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

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

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

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

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

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

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


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

@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;
    }
  }
}

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

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

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


এরকম কিছু:

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

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


ব্যবহার

@Before("execution(* (@YourAnnotationAtClassLevel *).*(..))")
    public void beforeYourAnnotation(JoinPoint proceedingJoinPoint) throws Throwable {
}

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

@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 {

}