Java/Spring/Pointcut

Материал из Java эксперт
Перейти к: навигация, поиск

All Kinds Of Pointcut

   <source lang="java">
      

File: context.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"

      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:tx="http://www.springframework.org/schema/tx"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx.xsd">
   <bean id="test" class="bean.TestBean2">
       <property name="simpleBean" ref="simple"/>
   </bean>
   <bean id="simple" class="bean.SimpleBean"/>
   <aop:config>
       <aop:advisor advice-ref="tx-advice"
                    pointcut="SystemPointcuts.testBeanExecution()"/>
   </aop:config>
   <bean id="transactionManager" class="NoopTransactionManager"/>
   <tx:advice id="tx-advice" transaction-manager="transactionManager">
       <tx:attributes>
           <tx:method name="*" propagation="REQUIRED"/> 
       </tx:attributes>
   </tx:advice>

</beans>

File: Main.java import org.aspectj.lang.annotation.Pointcut; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionException; import org.springframework.transaction.support.AbstractPlatformTransactionManager; import org.springframework.transaction.support.DefaultTransactionStatus; import bean.SimpleBean; import bean.TestBean2; public class Main {

 public static void main(String[] args) {
   ApplicationContext ac = new ClassPathXmlApplicationContext("context.xml");
   TestBean2 testBean = (TestBean2) ac.getBean("test");
   SimpleBean simpleBean = (SimpleBean) ac.getBean("simple");
   testBean.work();
   testBean.stop();
   simpleBean.sayHello();
   simpleBean.x("a", "b");
 }

} final class SystemPointcuts {

 private SystemPointcuts() {
 }
 @Pointcut("execution(* bean..*.*(..)) &&" +
         "!execution(* bean..*.set*(..)) &&" +
         "!execution(* bean..*.get*())")
 public void serviceExecution() { }
 @Pointcut("within(bean.TestBean2)")
 public void within1() { }
 @Pointcut("execution(* bean.TestBean2.*(..))")
 public void testBeanExecution() { }
 @Pointcut("execution(* bean.TestBean2.*(..))")
 private void testBeanExec() { }
 @Pointcut("execution(* bean..*.*(..))")
 public void inProsringPackage() { }
 @Pointcut("within(bean..*)")
 private void withinProSpringPackage() { }
 @Pointcut("execution(* bean.TestBean2.*(..)) &&" +
         "within(bean..*)")
 public void same1() { }
 @Pointcut("execution(* bean.TestBean2.*(..)) &&" +
         "withinProSpringPackage()")
 public void same2() { }
 @Pointcut("testBeanExec() && withinProSpringPackage()")
 public void same3() { }
 @Pointcut("within(bean.TestBean2)")
 public void fromTestBeanExecution() { }
 @Pointcut("this(bean.SimpleBean)")
 public void onlyFromSimpleBean() { }
 @Pointcut("target(bean.SimpleBean)")
 public void onlyToSimpleBean() { }
 @Pointcut("args(String, String)")
 public void onlyTwoStringArguments() { }

// @Pointcut("bean(test)")

 public void beanName() { }

} class NoopTransactionManager extends AbstractPlatformTransactionManager {

 protected Object doGetTransaction() throws TransactionException {
     return new Object();
 }
 protected void doBegin(Object object, TransactionDefinition transactionDefinition) throws TransactionException {
     System.out.println("Begin");
 }
 protected void doCommit(DefaultTransactionStatus defaultTransactionStatus) throws TransactionException {
     System.out.println("Commit");
 }
 protected void doRollback(DefaultTransactionStatus defaultTransactionStatus) throws TransactionException {
     System.out.println("Rollback");
 }

}


      </source>
   
  
 
  



Use NameMatchMethodPointcut

   <source lang="java">
      

File: Main.java import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.springframework.aop.Advisor; import org.springframework.aop.framework.ProxyFactory; import org.springframework.aop.support.DefaultPointcutAdvisor; import org.springframework.aop.support.NameMatchMethodPointcut; public class Main {

 public static void main(String[] args){
   MyClass target = new MyClass();
   NameMatchMethodPointcut pc = new NameMatchMethodPointcut();
   pc.addMethodName("foo");
   pc.addMethodName("bar");
   Advisor advisor = new DefaultPointcutAdvisor(pc, new SimpleAdvice());
   ProxyFactory pf = new ProxyFactory();
   pf.setTarget(target);
   pf.addAdvisor(advisor);
   MyClass proxy = (MyClass)pf.getProxy();
   proxy.foo();
   proxy.foo(1);
   proxy.bar();
   proxy.yup();
 }

} class SimpleAdvice implements MethodInterceptor {

 public Object invoke(MethodInvocation invocation) throws Throwable {
     System.out.println("start: " + invocation.getMethod().getName());
     Object retVal = invocation.proceed();
     System.out.println("end");
     return retVal;
 }

} class MyClass {

 public void foo() {
     System.out.println("foo");
 }
 public void foo(int x) {
     System.out.println("foo " + x);
 }
 public void bar() {
     System.out.println("bar");
 }
 public void yup() {
     System.out.println("yup");
 }

}


      </source>
   
  
 
  



Use NameMatchMethodPointcutAdvisor

   <source lang="java">
      

File: context.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"

   "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

 <bean id="afterBean" class="org.springframework.aop.framework.ProxyFactoryBean">
   <property name="target">
     <bean class="MtBean">
       <property name="firstName" value="AAA"/>
     </bean>
   </property>
   <property name="interceptorNames">
     <list>
       <idref bean="endMatchPointcutAdvisor"/>
     </list>
   </property>
   <property name="proxyTargetClass" value="true"/>
 </bean>
 <bean id="endMatchPointcutAdvisor"
       class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"
       singleton="false">
   <property name="advice" ref="concurrencyThrottleInterceptor"/>
   <property name="mappedName" value="showValues"/>
 </bean>
 <bean id="concurrencyThrottleInterceptor"
       class="org.springframework.aop.interceptor.ConcurrencyThrottleInterceptor"
       singleton="false">
   <property name="concurrencyLimit" value="5"/>
 </bean>

</beans>

File: Main.java import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.util.StopWatch; public class Main {

 public static void main(String[] args) throws Exception {
   BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("context.xml"));
   MtBean testBean = (MtBean) beanFactory
       .getBean("afterBean");
   testBean.showValues();
 }

} class MtBean {

 private String firstName;
 public String getFirstName() {
   return this.firstName;
 }
 public void setFirstName(String firstName) {
   this.firstName = firstName;
 }
 public void showValues() {
   System.out.println("First name: " + this.firstName);
 }

}


      </source>