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>
반응형
'자바과정 > 스프링' 카테고리의 다른 글
스프링 실습예제(회원가입 폼, lombok 사용) (0) | 2021.04.11 |
---|---|
스프링 Web(DispatcherServlet, HandlerMapping, HandlerAdapter, viewResolver) (2) | 2021.04.08 |
스프링 AOP(자바 방식, Spring XML 방식) (3) | 2021.04.08 |
스프링 실습예제(Xml 방식의 AOP) (0) | 2021.04.08 |
스프링 실습 예제(Profile, Environment 사용) (0) | 2021.04.07 |
댓글