note

Spring AOP XML스키마 기반의 POJO 클래스를 이용한 AOP 구현 본문

JSP/Spring

Spring AOP XML스키마 기반의 POJO 클래스를 이용한 AOP 구현

투한 2012. 3. 2. 11:41










실행화면(Main.java)

WriteArticleService.write(..)시작
WriteArticleServiceImpl.write() 메서드 실행
ArticleDao.insert(..)시작
MySQLArticleDao.insert() 실행
ArticleDao.insert(..)종료
ArticleDao.insert(..)실행시간 : 0ms
WriteArticleService.write(..)종료
WriteArticleService.write(..)실행시간 : 0ms





lib 설정하는 방법 이전 게시물 참고
[JSP/Spring] - Spring 설치 & 셋팅(응용 프로그램) 





Article -> ArticleDao -> MySQLArticleDao에 implements ->











applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:aop="http://www.springframework.org/schema/aop" 
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	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-3.0.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.0.xsd">

	<!-- Advice 클래스를 빈으로 등록 -->
	<bean id="performanceTraceAdvice" class="madvirus.spring.chap05.aop.pojo.ProfilingAdvice" />
	
	<!-- Aspect 설정 : Advice를 어떤 Pointcut에 적용할 지 설정 -->
	<aop:config>
		<aop:aspect id="traceAspect1" ref="performanceTraceAdvice">
			<aop:pointcut id="publicMethod" expression="execution(public * madvirus.spring.chap05.board..*(..))"  />
				<aop:around method="trace" pointcut-ref="publicMethod" />
		</aop:aspect>
	</aop:config>
	
	
	<bean id="writeArticleService" class="madvirus.spring.chap05.board.service.WriteArticleServiceImpl" >
		<constructor-arg>
			<ref bean="articleDao"/>
		</constructor-arg>
	</bean>
	
	<bean id="articleDao" class="madvirus.spring.chap05.board.dao.MySQLArticleDao" />
</beans>




공통 관심 사항
<aop:pointcut id="publicMethod" expression="execution(public * madvirus.spring.chap05.board..*(..))"  />
				<aop:around method="trace" pointcut-ref="publicMethod" />



<aop:aorund> 메서드 호출 이전, 이후, 예외 발생등 모든 시점에 적용가능한 Advice










Main
package madvirus.spring.chap05.aop.pojo;

import madvirus.spring.chap05.board.Article;
import madvirus.spring.chap05.board.service.WriteArticleService;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
	public static void main(String[] args) {
		String[] configLocations = new String[] { "applicationContext.xml" };
		ApplicationContext context = new ClassPathXmlApplicationContext(
				configLocations);

		WriteArticleService articleService= (WriteArticleService) context.getBean("writeArticleService");

		articleService.write(new Article());
	}
}







ProfilingAdvice
package madvirus.spring.chap05.aop.pojo;

import org.aspectj.lang.ProceedingJoinPoint;

public class ProfilingAdvice {
	public Object trace(ProceedingJoinPoint joinPoint) throws Throwable{
		String signatureString = joinPoint.getSignature().toShortString();

		System.out.println(signatureString +"시작");

		long start = System.currentTimeMillis();

		try{
			Object result =joinPoint.proceed();
			return result;
		}finally{
			long finish = System.currentTimeMillis();
			System.out.println(signatureString +"종료");

			System.out.println(signatureString +"실행시간 : "+(finish - start)+"ms");
		}
	}
}







Article
package madvirus.spring.chap05.board;

import madvirus.spring.chap05.board.dao.ArticleDao;

public class Article {
 
	private int id;
	private ArticleDao articleDao;

	public Article() {
	}

	public Article(int id) {
		this.id = id;
	}

	public int getId() {
		return id;
	}

	public void increaseReadCount() {
		articleDao.updateReadCount(id, 1);
	}

	public void setArticleDao(ArticleDao articleDao) {
		this.articleDao = articleDao;
	}

}






ArticleDao
package madvirus.spring.chap05.board.dao;

import madvirus.spring.chap05.board.Article;

public interface ArticleDao {

	void insert(Article article);

	void updateReadCount(int id, int i);
} 





MySQLArticleDao
package madvirus.spring.chap05.board.dao;

import madvirus.spring.chap05.board.Article;

public class MySQLArticleDao implements ArticleDao {

	@Override
	public void insert(Article article) {
		System.out.println("MySQLArticleDao.insert() 실행");
	}  

	@Override
	public void updateReadCount(int articleId, int inc) {
		System.out.println("MySQLArticleDao.updateReadCount() 실행");
	}
}






WriteArticleService
package madvirus.spring.chap05.board.service;

import madvirus.spring.chap05.board.Article;

public interface WriteArticleService {

	void write(Article article);
}





WriteArticleServiceImpl
package madvirus.spring.chap05.board.service;

import madvirus.spring.chap05.board.Article;
import madvirus.spring.chap05.board.dao.ArticleDao;

public class WriteArticleServiceImpl implements WriteArticleService {

    private ArticleDao articleDao;

    public WriteArticleServiceImpl() {
    }
    
    public WriteArticleServiceImpl(ArticleDao articleDao) {
        this.articleDao = articleDao;
    }

    @Override
    public void write(Article article) {
        System.out.println("WriteArticleServiceImpl.write() 메서드 실행");
        articleDao.insert(article);
    }

}





Member
package madvirus.spring.chap05.member;

public class Member {

}




MemberService
package madvirus.spring.chap05.member.service;

import madvirus.spring.chap05.member.Member;

public interface MemberService {
	
	void regist(Member member);
	
	boolean update(String memberId, UpdateInfo info);
}





MemberServiceImpl
package madvirus.spring.chap05.member.service;

import madvirus.spring.chap05.member.Member;

public class MemberServiceImpl implements MemberService {


	@Override
	public void regist(Member member) {
		System.out.println("MemberServiceImpl.regist() 메서드 실행");
	}

	@Override
	public boolean update(String memberId, UpdateInfo info) {
		System.out.println("MemberServiceImpl.update() 메서드 실행");
		return true;
	}

}




UpdateInfo
package madvirus.spring.chap05.member.service;

public class UpdateInfo {

}