2020년 10월 9일 금요일

스프링프레임워크, AOP 포인트컷(pointcut),JdkRegexpMethodPointcut이론실습/포인트컷/Advisor/타겟클래스/위빙(자바동영상/스프링동영상/자바교육/스프링교육/SpringFramework/스프링프레임워크/스프링학원/자바학원/자바/JAVA)

 스프링프레임워크, AOP 포인트컷(pointcut),JdkRegexpMethodPointcut이론실습/포인트컷/Advisor/타겟클래스/위빙(자바동영상/스프링동영상/자바교육/스프링교육/SpringFramework/스프링프레임워크/스프링학원/자바학원/자바/JAVA)


ojc.asia/bbs/board.php?bo_table=LecSpring&wr_id=871   


스프링프레임워크, AOP 포인트컷(pointcut),JdkRegexpMethodPointcut이론실습/포인트컷/Advisor/타겟클래스/��

스프링프레임워크, AOP 포인트컷(pointcut),JdkRegexpMethodPointcut이론실습/포인트컷/Advisor/타겟클래스/위빙(자바동영상/스프링동영상/자바교육/스프링교육/SpringFramework/스프링프레임워크/스프링학원/��

ojc.asia



https://youtu.be/SBMHLYGQE14



포인트컷(Pointcut) - JdkRegexpMethodPointcut

 

n  메소드 이름을 정확히 알지 못하는 경우, 이름대신 패턴을 사용하여 포인트 컷을 생성할 수 있는데 이때 사용되는 포인트 컷이 JdkRegexpMethodPointcut 이다.

n  java.util.regex 패키지를 기반으로하는 정규식 포인트 컷.

 

[First.java]


package onj.edu.aop4;

 

public class First {

           public void hello1() {

                      System.out.println("hello1 ... ");

           }

           public void hello2() {

                      System.out.println("hello2 ... ");

           }

           public void sayHello() {

                      System.out.println("sayHello ... ");

           }

}

 

[RegExpExam.java]


public class RegExpExam {

public static void main(String[] args) {

           First target = new First();

           //Advisor


           JdkRegexpMethodPointcut pc = new JdkRegexpMethodPointcut();

           //스프링은 비교할 때 패키지.클래스.메소드명을 사용한다.


           // hello로 시작하는 메소드면  OK


           pc.setPattern("aoptest*.*.hello*.");

           Advisor advisor = new DefaultPointcutAdvisor(pc, new                                                                                                  SimpleAdvice());

           //Proxy


           ProxyFactory pf = new ProxyFactory();

           pf.setTarget(target);

           pf.addAdvisor(advisor);

           First f = (First)pf.getProxy();

           f.hello1();

           f.hello2();

           f.sayHello();

           }

}

 

[결과]

hello1

hello1 ...

... SimpleAdvice의 충고가 적용됨 ...

hello2

hello2 ...

... SimpleAdvice의 충고가 적용됨 ...

sayHello ...

 

Pointcut은 Advice가 적용될 메소드를 골라야 하는데 Method Signature에 일치하는 패턴을 지정하는 방법을 주로 사용하는 포인트 컷이다.

 

org.springframework.aop.support.JdkregexpMethodPointcut JDK1.4이상 사용

 

<bean id=“smallMartPointcut” class=“org.springframework.aop.support.JdkregexpMethodPointcut”>

<!-- 어떤클래스든 관계없고 get으로 시작하는 메소드 à


    <property name=“pattern” value=“*.get*”/>

</bean>

 

Pointcut을 정의했으면 이를 Advice에 결합시킬 수 있다.

 

<bean id=“smallMartAdvisor” class=“org.springframework.aop.support.DefaultPointcutAdvisor”>

    <property name=“advice” ref=“myAdvice”/>

    <property name=“pointcut” ref= “myPointcut”/>

</bean>

 

앞에서 pointcut을 만들고 advice와 결합을 시켰는데 하나의 빈에 pointcut과 advice를 동시에 정의할 수 있는 특별한 Advisor가 있다.


(org.springframework.aop.support.RegexpMethodPointcutAdvisor)

 

<bean id=“smallMartAdvisor” class=“org.springframework.aop.support. RegexpMethodPointcutAdvisor”>

    <property name=“advice” ref=“beforeLogging”/>

    <property name=“pattern” value=“*.get*”/>

</bean>

 

------------ 실습2. ProxyFactoryBean을 이용한 XML형식

 

[regexp.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"


           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

 

           <!-- 타겟 틀래스 -->

           <bean id="first" class="aoptest2.First" />

 

           <!-- 충고 클래스 -->

           <bean id="myAdvice" class="aoptest2.SimpleAdvice" />

 

           <!-- 포인트컷 -->

           <bean id="myPointcut"           class="org.springframework.aop.support.JdkRegexpMethodPointcut">

                      <!-- 어떤클래스든 관계없고 get으로 시작하는 메소드  -->

                      <property name="patterns">

                                 <list>

                                             <value>aoptest*.*</value>

                                             <!-- <value>aoptest*.*.hello*.</value>  -->

                                 </list>

                      </property>

           </bean>

 

           <bean id="myAdvisor"           class="org.springframework.aop.support.DefaultPointcutAdvisor">

                      <property name="pointcut" ref="myPointcut" />

                      <property name="advice" ref="myAdvice" />

           </bean>

 

           <!-- 하나의 빈에 pointcut과 advice를 동시에 정의할 수 있는 특별한 Advisor -->

           <!-- <bean id="myAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">


                      <property name="advice" ref="myAdvice"/> <property name="pattern" value="aoptest.*"/>

                      대소문자 구분함 </bean> -->

 

           <!-- 프록시 -->

           <bean id="myProxy"

                      class="org.springframework.aop.framework.ProxyFactoryBean">

                      <property name="target">

                                 <ref bean="first" />

                      </property>

                      <property name="interceptorNames">

                                 <list>

                                             <value>myAdvisor</value>

                                 </list>

                      </property>

           </bean>

 

</beans>

 

 

[RegExpExam.java]

 

package aoptest;

import org.springframework.context.support.GenericXmlApplicationContext;

 

public class RegExpExam {

           public static void main(String[] args) {                  

                      GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();

                      ctx.load("regexp.xml");

                      ctx.refresh();

                     

                      //XML에서 만든 Proxy빈 로딩

                      First f = (First)ctx.getBean("myProxy");

 

                      //프록시를 통한 호출

                      f.hello1();

                      f.hello2();

                      f.sayHello();

           }

}

 

-- aoptest패키지의 모든것

aoptest*.*

-- aoptest패키지의 hello로 시작하는 메소드

aoptest*.*.hello*.

 


 




#JdkRegexpMethodPointcut, #스프링포인트컷, #스프링충고, #포인트컷, #스프링pointcut, #스프링AOP, #스프링advice, #SpringAOP, #스프링DI, #스프링IoC, #SpringDI, #SpringIoC, #자바스프링, #Spring동영상, #Spring강의, #스프링프레임워크, #스프링교육, #스프링학원, #스프링강좌, #스프링강의, #자바학원, #자바, #스프링동영상, #자바동영상, #스프링프레임워크교육, #스프링프레임워크강의, #스프링프레임워크학원 

스프링프레임워크,AOP 포인트컷(pointcut),NameMatchMethodPointcut 이론및실습/포인트컷/Advisor/타겟클래스/위빙(자바동영상/스프링동영상/스프링교육)

 

스프링프레임워크,AOP 포인트컷(pointcut),NameMatchMethodPointcut 이론및실습/포인트컷/Advisor/타겟클래스/위빙(자바동영상/스프링동영상/스프링교육)


http://ojc.asia/bbs/board.php?bo_table=LecSpring&wr_id=870


스프링프레임워크,AOP 포인트컷(pointcut),NameMatchMethodPointcut 이론및실습/포인트컷/Advisor/타겟클래스

스프링프레임워크,AOP 포인트컷(pointcut),NameMatchMethodPointcut 이론및실습/포인트컷/Advisor/타겟클래스/위빙(자바동영상/스프링동영상/자바교육/스프링교육/SpringFramework/스프링프레임워크/스프링학원

ojc.asia


https://youtu.be/DwbwuY0e9WY





스프링프레임워크,AOP 포인트컷(pointcut),NameMatchMethodPointcut 이론및실습/포인트컷/Advisor/타겟클래스/위빙(자바동영상/스프링동영상/자바동영상/자바교육/스프링교육/SpringFramework/스프링프레임워크/스프링학원/자바학원/자바/JAVA)


[포인트컷(Pointcut) - NameMatchMethodPointcut]

가끔은 메소드 시그네처, 리턴형은 무시하고 메소드 이름으로 적용여부를 판단하는 포인트 컷이 필요하다.

이때 사용되는 포인트 컷이 NameMatchMethodPointcut 이다.

포인트 컷으로 사용할 클래스를 만들지 않아도 되며 직접 NameMatchMethodPointcut을 new 하면 된다.

-- 실습

[pom.xml에 추가]

<properties>

<org.springframework-version>5.2.9.RELEASE</org.springframework-version>

</properties>

<dependencies>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>${org.springframework-version}</version>

</dependency>

</dependencies>

[First.java]

public class First {

public void one() {

System.out.println("First One...");

}

public void two() {

System.out.println("First Two...");

}

public void three() {

System.out.println("First Three...");

}

}

[Second.java]

public class Second {

public void one() {

System.out.println("Second One...");

}

public void two() {

System.out.println("Second Two...");

}

public void three() {

System.out.println("Second Three...");

}

}

[SimpleAdvice.java]

import org.aopalliance.intercept.MethodInterceptor;

import org.aopalliance.intercept.MethodInvocation;

public class SimpleAdvice implements MethodInterceptor {

public Object invoke(MethodInvocation invocation) throws Throwable {

System.out.println(invocation.getMethod().getName());

Object o = invocation.proceed();

System.out.println("... SimpleAdvice의 충고가 적용됨 ...");

return o;

}

}

[NameMatchMethodPointcutExam.java]

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

public static void main(String[] args) {

First target = new First();

Second target2 = new Second();

// Advisor

NameMatchMethodPointcut pc = new NameMatchMethodPointcut();

pc.addMethodName("one");

pc.addMethodName("two");

Advisor advisor = new DefaultPointcutAdvisor(pc, new SimpleAdvice());

// Proxy

ProxyFactory pf = new ProxyFactory();

pf.setTarget(target);

pf.addAdvisor(advisor);

First f = (First) pf.getProxy();

f.one();

f.two();

f.three();

System.out.println("-------------------");

// Proxy

ProxyFactory pf2 = new ProxyFactory();

pf2.setTarget(target2);

pf2.addAdvisor(advisor);

Second f2 = (Second) pf2.getProxy();

f2.one();

f2.two();

f2.three();

}

}

[실행결과]

one

First One...

... SimpleAdvice의 충고가 적용됨 ...

two

First Two...

... SimpleAdvice의 충고가 적용됨 ...

First Three...

-------------------

one

First One...

... SimpleAdvice의 충고가 적용됨 ...

two

First Two...

... SimpleAdvice의 충고가 적용됨 ...

First Three...


#NameMatchMethodPointcut, #스프링포인트컷, #스프링충고, #포인트컷, #스프링pointcut, #스프링AOP, #스프링advice, #SpringAOP, #스프링DI, #스프링IoC, #SpringDI, #SpringIoC, #자바스프링, #Spring동영상, #Spring강의, #스프링프레임워크, #스프링교육, #스프링학원, #스프링강좌, #스프링강의, #자바학원, #자바, #스프링동영상, #자바동영상, #스프링프레임워크교육, #스프링프레임워크강의, #스프링프레임워크학원



2020년 10월 7일 수요일

스프링프레임워크,AOP 포인트컷(pointcut), DynamicMethodMatcherPointcut 이론및실습/포인트컷/타겟클래스/위빙(자바동영상/스프링동영상/자바동영상/자바교육/스프링교육/SpringFramework/스프링프레임워크/스프링학원/자바학원/자바/JAVA)

 


스프링프레임워크,AOP 포인트컷(pointcut), DynamicMethodMatcherPointcut 이론및실습/포인트컷/타겟클래스/위빙(자바동영상/스프링동영상/자바동영상/자바교육/스프링교육/SpringFramework/스프링프레임워크/스프링학원/자바학원/자바/JAVA)   

 

 

포인트컷(Pointcut) - DynamicMethodMatcherPointcut

 

n  정적 정보인 클래스이름메소드이름에 더해 메소드 매개변수의 특정한 조건에 따라 충고가 적용될 메소드를 정의하는 포인트컷 이다.

n  DynamicMethodMatcherPointcut에서 충고가 적용되는 메소드는 모든 메소드를 검사하는 초기화 단계메소드가 처음 호출되는 시점에 걸쳐 두 번의 정적 검사를 받게 된다.  이 처럼 동적 포인트 컷은 정적 포인트 컷 보다 유연하게 적용될 수 있지만 성능 부담을 고려해 필요한 경우만 사용해야 한다.

 

[First.java]

package onj.edu.aop2;

 

public class First {

           public void one(int i) {

                      System.out.println("First One... i = " + i);

           }

           public void two() {

                      System.out.println("First Two...");

           }

 

[SimpleAdvice.java]

package onj.edu.aop2;

 

import org.aopalliance.intercept.MethodInterceptor;

import org.aopalliance.intercept.MethodInvocation;

//주변충고

public class SimpleAdvice implements MethodInterceptor {

           public Object invoke(MethodInvocation invocation) throws Throwable {

                      System.out.println(invocation.getMethod().getName());                   

                      Object o = invocation.proceed();

                      System.out.println("... SimpleAdvice의 충고가 적용됨 ...");

                     

                      return o;

           }

}

 

[SimpleDynamicPointcut.java]

package onj.edu.aop2;

 

import java.lang.reflect.Method;

 

import org.springframework.aop.ClassFilter;

import org.springframework.aop.support.DynamicMethodMatcherPointcut;

 

/* DynamicMethodMatcherPointcut

 * matches(Method method, Class<?> cls, Object[] args) 반드시 구현해야함

 정적체크를 위해서는 matches(Method method, Class<?> cls)도 같이 구현해야 한다.

 */

public class SimpleDynamicPointcut extends DynamicMethodMatcherPointcut {

 

           //메소드 이름이 one 인 경우 true 즉 충고가 주입된다.아래는 정적체크

           //스프링은 two  메소드에 대해서는 동적 검사를 진행 안함

           public boolean matches(Method method, Class<?> cls) {

                      System.out.println("static check :: method.getName() :: " + method.getName());

                   return "one".equals(method.getName());

           }

 

           //동적 검사

           public boolean matches(Method method, Class<?> cls, Object[] args) {

                      System.out.println("Dynamic Check : " + ((Integer)args[0]).intValue());

 

                      int i = ((Integer)args[0]).intValue();

                      return i > 100;

           }

 

           //First.class만 충고가 주입된다.

           public ClassFilter getClassFilter() {

                      return new ClassFilter() {

                                 public boolean matches(Class <?> cls) {

                                 return (cls == First.class);

                                 }

                      };

           }

}

 

[DynamicPointcutExam.java]

package onj.edu.aop2;

import org.springframework.aop.Advisor;

import org.springframework.aop.framework.ProxyFactory;

import org.springframework.aop.support.DefaultPointcutAdvisor;

public class DynamicPointcutExam {

           public static void main(String[] args) {

                      First target = new First();

                      //어드바이저 생성

                      Advisor advisor = new DefaultPointcutAdvisor(new                          SimpleDynamicPointcut(), new SimpleAdvice());

 

                      ProxyFactory pf = new ProxyFactory();

                      pf.setTarget(target);

                      pf.addAdvisor(advisor);

                      First proxy = (First)pf.getProxy();

 

                      proxy.one(99);

                      proxy.one(101);

                      proxy.two();

           }

}

 

[결과]

e13085d7c61c439cda277ddfbd230ee2_1602076
 

 

#DynamicMethodMatcherPointcut, #스프링포인트컷, #스프링충고, #포인트컷, #스프링pointcut, #스프링AOP, #스프링advice, #SpringAOP, #스프링DI, #스프링IoC, #SpringDI, #SpringIoC, #자바스프링, #Spring동영상, #Spring강의, #스프링프레임워크, #스프링교육, #스프링학원, #스프링강좌, #스프링강의, #자바학원, #자바, #스프링동영상, #자바동영상, #스프링프레임워크교육, #스프링프레임워크강의, #스프링프레임워크학원    

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...