반응형
  1. @Aspect   // aspect 선언
  2. public class Audience {
  3.     @Pointcut("execution(* *.perform(..))") // pointcut 정의
  4.     public void performance(){}
  5.    
  6.     @Before("performance()")
  7.     public void takeSeats(){
  8.    
  9.     }
  10.    
  11.     @AfterReturning("performance()")
  12.     public void applaud(){
  13.        
  14.     }
  15.    
  16.     @AfterThrowing("performance()")
  17.     public void demandRefund(){
  18.        
  19.     }
  20. }
@AspectJ 기반의 빈을 애스펙트로 변환하는 방법을 알고 있는 오토프록시 빈 선언
AnnotationAwareAspectJAutoProxyCreator  -> 이름이 길다 -_-;
대신
<aop:aspectj-autoproxy /> 
이거 한방이면 끝.

대신 이걸 사용하기 위해서는
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"
이거 추가해야함!! 


728x90
반응형
반응형
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />

이렇게 선언해놓으면 ProxyFactoryBean을 따로 선언해줄 필요가 없다.

DefaultAdvisorAutoProxyCreator를 선언하면 스프링 컨테이너는 이빈을 BeanPostProcessor로 인식한다.
bean에 id가 없는건 이 빈을 참조해서 사용할 필요가 없기 때문이다.

(참고)----------
Application Context 내에 bean lifecycle

인스턴스화 -> property 할당 -> BeannameAware의 setBeanName() -> BeanFactoryAware의 setBeanFactory()
->ApplicationContextAware의 setApplicationContext()
-> BeanPostProcessor의 postProcessBeforeInitialization()
-> InitializingBean의 afterPropertiesSet() -> 커스텀 초기화 메서드 호출 
-> BeanPostProcessor의 postProcessAfterInitialization()...

위에서 말한 BeanPostProcessor로 인식한다는 말은 위에 적힌 lifeCycle에서 BeanPostPrecessor 로딩시 자동으로 bean을 생성한다는 말인것 같다. 

 
728x90
반응형
반응형
  1. <bean id="audienceAdvisor" class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor">
  2.     <prorperty name="advice" ref="audienceAdvice"></prorperty>
  3.     <prorperty name="expression" value="execution(* *.perform(..))"></prorperty>
  4. </bean>

excution(* *.perform(..))


excution  : method가 실행될때
*            : 모든 반환 값 타입에 대해
*.           : 모든 클래스의
perform   : perform() method
(..)         : 인자의 개수에 상관없이 


728x90
반응형
반응형
포인트컷은 어드바이스가 적용돼야할 메서드를 골라내는것

pointcut 정의
  1. <bean id="performancePointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
  2.     <prorperty name="pattern" value=".*perform">
  3. </prorperty></bean>
advice와 pointcut 결합
  1. <bean id="audienceAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
  2.     <prorperty name="advice" ref="audienceAdvice">
  3.     <prorperty name="pointcut" ref="performancePointcut">
  4. </prorperty></prorperty></bean>
하나의 빈 설정으로 pointcut과 advice 동시정의
  1. <bean id="audienceAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
  2.     <prorperty name="advice" ref="audienceAdvice">
  3.     <prorperty name="pointcut" ref=".*perform">
  4. </prorperty></prorperty></bean>


728x90
반응형
반응형

cross-cutting-concerns(횡단관심사) : 한 어플리케이션이 여러부분에 걸쳐있는 기능
aspect-oriented programming(AOP) : 횡단 관심사의 분리를 위한것 


 용어  정의
advice aspect가 해야할 작업. aspect가 '무엇'을 '언제'할지를 정의한다. 
joinpoint advice를 적용할수 있는곳, 어플리케이션 실행에 aspect를 끼워넣을수 있는 지점. 
pointcut aspect가 advice할 joinpoint 영역을 좁힌다. '어디서' 하는것을 정의한다. 
aspect advice와 pointcut을 합친것. '무엇','언제','어디서'가  앞의 2가지에 의해서 정의된다. 
target advice가 적용될 객체.  
proxy  advice를 taget 객체에 적용하면 생성되는 객체. taget객체와 proxy 객체는 차이가 없어야 한다.   
weaving target객체에 aspect를 적용해서 새로운 proxy 객체를 생성하는 절차. 
728x90
반응형
반응형

Excpetion 처리시 아무생각 안하고 e.getStackTrace()를 사용했는데.
이렇게 처리하면 스택을 확인해서 처리하게 되기 때문에 시간도 많이걸리고
콘솔에 찍히는 내용도 뭔지 모르게 된다. 

  1. public class LogTest {
  2.     private static final Logger logger = Logger.getLogger("LogTest");
  3.     public static void main(String[] args) {
  4.         try{
  5.             int i = 0;
  6.             int j = 3/i;
  7.         }catch (Exception e) {
  8.             StackTraceElement[] ste = e.getStackTrace();
  9.             String className = ste[0].getClassName();
  10.             String methodName = ste[0].getMethodName();
  11.             int lineNumber = ste[0].getLineNumber();
  12.             String fileName = ste[0].getFileName();
  13.             logger.severe("Exception : " + e.getMessage());
  14.             logger.severe(className + "." + methodName + " " + fileName + " " + lineNumber + " line");
  15.         }
  16.     }
  17. }
이렇게 처리하면 속도도 빠르고 내용도 잘 알아볼수 있다.
(출처 : "자바성능을 결정짓는 코딩습관과 튜닝이야기") 


728x90
반응형
반응형
스프링은 4종류의 와이어링을 제공한다.

1. byName (autowire="byName")
    property 이름과 동일한 빈을 와이어링 해준다.
    이름이 반드시 같아야한다.

2. byType
    property type과 동일한 빈을 와이어링 해준다.
    할당 가능한 타입의 빈이 둘 이상일 경우에는 예외 발생시킨다.

3. constructor
   해당 빈의 생성자에 맞는 빈을 자동으로 선택해준다.

4. autodetect
    컨테이너가 알아서 결정해준다.
    최초에는 constructor 방식을 먼저 적용, 그다음에 byType 방식을 시도한다.

오토와이어링 문제점.
- 명확성 결여된다. 
728x90
반응형
반응형
단일 서블릿 컨텍스트 구성 방법
  1. <servlet>
  2.     <servlet-name>spring</servlet-name>
  3.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  4.     <init-param>
  5.         <param-value>contextConfigLocation</param-value>
  6.         <param-value>
  7.             /WEB-INF/applicationContext.xml
  8.             /WEB-INF/spring-servlet.xml
  9.         </param-value>
  10.     </init-param>
  11.     <load-on-startup>1</load-on-startup>
  12. </servlet>
<load-on-startup> 서블릿 컨테이너가 서블릿을 언제 만들고 초기화할지 순서 정함. 보통 1. 


728x90
반응형
반응형
모든 애플리케이션 컨텍스트는 부모 애플리케이션 컨텍스트를 가질수 있다.
단. 애플리케이션 컨텍스트의 검색 순서는 항상 자신 먼저이고 그런 다음 직계 부모 순서이다.
하위 컨텍스트는 검색에서 제외된다.
같은 레벨의 컨텍스트도 갬색에서 제외된다.
동일한 bean 이 부모에게도 있을경우 자식의 bean이 부모의 bean을 오버라이드 한다. 
  1. ApplicationContext parent = new GenericXmlApplicationContext("parents.xml");
  2. GenericApplicationContext child = new GenericApplicationContext(parent);
  3.        
  4. XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(child);
  5. reader.loadBeanDefinitions("child.xml");
  6. child.refresh();
출처 : 토비 스프링3 



728x90
반응형

+ Recent posts