본문 바로가기
자바과정/스프링

스프링 AOP (Annotation 방식과 Pointcut 종류)

by Parkej 2021. 4. 8.

AOP Annotation 방식

Annotation 시작 전
파일구조
- java : MainClass, LogAop, Student, Worker
- resource : appCTX.xml

디렉터리 구조

 

데이터 클래스
Student.java / Worker.java
//////// Student

package com.javalec.ex;

public class Student {
	private String name;
	private int age;
	private int gradeNum;
	private int classNum;
	
	public void getStudentInfo() {
		System.out.println("이름 : " + getName());
		System.out.println("나이 : " + getAge());
		System.out.println("학년 : " + getGradeNum());
		System.out.println("반 : " + getClassNum());
		
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getGradeNum() {
		return gradeNum;
	}

	public void setGradeNum(int gradeNum) {
		this.gradeNum = gradeNum;
	}

	public int getClassNum() {
		return classNum;
	}

	public void setClassNum(int classNum) {
		this.classNum = classNum;
	}
	
}



/////////// Worker
package com.javalec.ex;

public class Worker {
	private String name;
	private int age;
	private String job;

	public void getWorkerInfo() {
		System.out.println("이름 : " + getName());
		System.out.println("나이 : " + getAge());
		System.out.println("직업 : " + getJob());
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getJob() {
		return job;
	}

	public void setJob(String job) {
		this.job = job;
	}
	
}

 

 

LogAop.java
execution : Advice를 적용할 메서드를 명시할 때 사용합니다.
within : 특정 타입에 속하는 메서드를 JoinPoint로 설정되도록 명시할 때 사용합니다.
bean : 스프링 버전 2.5 버전부터 지원하기 시작했으며, 스프링 빈을 이용하여 JoinPoint를 설정합니다.

@Around
@Before
@AfterReturning
@AfterThrowing
@After
package com.javalec.ex;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;


@Aspect // 공통기능 지정 
// LogAop Aspect가 지정됨
public class LogAop {
	// 상세한 포인트컷 execution
//	@Pointcut("execution(public void get*(..))")
	// public void인 모든 get 메소드
	
//	@Pointcut("execution(* com.javalec.ex.*.*())")
	// com.javalec.ex 패키지에 파라미터가 없는 모든 메소드
	
//	@Pointcut("execution(* com.javalec.ex..*.*())")
	// com.javalec.ex 패키지 & com.javalec.ex 하위 패키지의 모든 메소드
	
//	@Pointcut("execution(* com.javalec.ex.Worker.*())")
	// com.javalec.ex.Worker 안의 모든 메소드
	
	// within 패키지
//	@Pointcut("within(com.javalec.ex.Worker)")
	// com.javalec.ex.Worker 모든 메소드
	
//	@Pointcut("within(com.javalec.ex..*)")
	// com.javalec.ex 패키지 및 하위 패키지 안에 있는 모든 메소드
	
	@Pointcut("within(com.javalec.ex.*)")
	// com.javalec.ex 패키지 안에 있는 모든 메소드
	
	// 빈에만
//	@Pointcut("bean(student)") // student 빈에만 적용
	
//	@Pointcut("bean(*ker)") // ~ker로 끝나는 빈에만 적용
	private void pointcutMethod() {
		
	}
	
	@Around("pointcutMethod()")
	public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable{
		String signatureStr = joinpoint.getSignature().toShortString();
		System.out.println( signatureStr + "is start ");
		long st = System.currentTimeMillis();
		try {
			Object obj = joinpoint.proceed();
			return obj;
		}finally {
			long et = System.currentTimeMillis();
			System.out.println(signatureStr + "is finished");
			System.out.println(signatureStr + "경과시간 : " + (et - st));
		}
	}
	
	@Before("within(com.javalec.ex.*)")
	public void beforeAdvice(JoinPoint joinPoint) {
		System.out.println("beforeAdvice()");
	}
	@AfterReturning("within(com.javalec.ex.*)")
	public void afterReturningAdvice() {
		System.out.println("afterReturningAdvice()");
	}
	
	@AfterThrowing("within(com.javalec.ex.*)")
	public void afterThrowingAdvice() {
		System.out.println("afterThrowingAdvice()");
	}
	
	@After("within(com.javalec.ex.*)")
	public void afterAdvice() {
		System.out.println("afterAdvice()");
	}
}

 

 

 

 

MainClass.java
package com.javalec.ex;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
	public static void main(String[] args) {
		
		AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:appCTX.xml");

		Student student = ctx.getBean("student", Student.class);
		student.getStudentInfo();

		Worker worker = ctx.getBean("worker", Worker.class);
		worker.getWorkerInfo();

	}
}

 

 

 

 

appCTX.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: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-3.1.xsd">

	<!-- Annotation 방식을 사용하기 위한 Xml 호출 -->
	<aop:aspectj-autoproxy/>
	<bean id="logAop" class="com.javalec.ex.LogAop"></bean>
	
	<bean id="student" class="com.javalec.ex.Student">
		<property name="name" value="ppp" />
		<property name="age" value="10" />
		<property name="gradeNum" value="1" />
		<property name="classNum" value="3" />
	</bean>
	<bean id="worker" class="com.javalec.ex.Worker">
		<property name="name" value="pep" />
		<property name="age" value="15" />
		<property name="job" value="stu" />
	</bean>
</beans>

 


출력결과

 


 

반응형

댓글