스프링(AOP)

서울IT코드정리 /kyChoi·2021년 11월 11일
0

스프링

목록 보기
9/17

Aspect 공통기능
Advicd : 공통기능 자체
Jointpoint : Advice를 적용해야 되는 부분
Pointcut : Jointpoint 의 부분으로 실제로 Advice 가 적용되는 부분
Weaving : Advice 를 핵심 기능에 적용하는 행위
의존설정 , 라이브러리 다운 pom.xml

<!--AOP-->
<dependency>
	<groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.7.4</version>
</dependency>     
			<dependency>
		    <groupId>cglib</groupId>
		    <artifactId>cglib</artifactId>
		    <version>3.2.3</version>
		</dependency>//해당 라이브러리 없다면 에러 발생
라이브러리 주입
Exception in thread "main" org.springframework.aop.framework.AopConfigException: Cannot proxy target class because CGLIB2 is not available
//에러메세지

><?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">
  
<bean id ="logAop" class="com.javalec.ex.LogAop"/>
//클래스의 빈의 객체를 생성합니다 id 는 logAop 입니다
<aop:config> //AOP 시작합니다
<aop:aspect id="logger" ref="logAop">//AOP는 LogAop를 참조합니다, 아이디는 logger 입니다
	<aop:pointcut expression="within(com.javalec.ex.*)" id="publicM"/>//공통 클래스가 위치할 장소입니다. com.javalec.ex.*에 위치합니다  아이디는 publicM 입니다
	<aop:around pointcut-ref="publicM" method="loggerAop"/>
  //publicM 이 지정한 위치에 공통 메소드가 실행됩니다
  //around 는 핵심 메소드 시작과 끝에 실행됩니다
</aop:aspect>
</aop:config>

<bean id="student" class="com.javalec.ex.Student">
<property name="name" value="홍길동"/>
<property name="age" value="10"/>
<property name="gradeNum" value="3"/>
<property name="classNum" value="5"/>
</bean>

<bean id="worker" class="com.javalec.ex.Worker">
<property name="name" value="홍길순"/>
<property name ="age" value="35"/>
<property name="job" value="개발자"/>
</bean>
</beans>

package com.javalec.ex;
public class Student {
private String name;
private int age;
private int gradeNum;
private int classNum;
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;
}
//여기가 핵심 메소드 입니다
여기에 공통기능 실행 -시작 -> aop:around
public void getStudentInfo() {
System.out.println("이름 : " + getName());
System.out.println("나이 : " + getAge());
System.out.println("학년 : " + getGradeNum());
System.out.println("반 : " + getClassNum());
}
//여기에 공통기능 실행 -끝 -> aop:around
}

package com.javalec.ex;
public class Worker {
private String name;
private int age;
private String job;
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;
}
//여기에 공통기능 실행 -시작 -> aop:around
public void getWorkerInfo() {
System.out.println("이름 : " + getName());
System.out.println("나이 : " + getAge());
System.out.println("학년 : " + getJob());
}
//여기에 공통기능 실행 -끝 -> aop:around
}

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:applicationCTX.xml");
Student student = ctx.getBean("student", Student.class);
student.getStudentInfo();
Worker worker = ctx.getBean("worker",Worker.class);
worker.getWorkerInfo();
ctx.close();
}
}
메인 클라스 입니다. GenericXmlApplication 이 .xml 을 읽어들입니다. student 객체를 가져와 사용합니다. 메소드 getStudentInfo 를 실행합니다
getWorkerInfo 메소드 실행합니다

package com.javalec.ex;

import org.aspectj.lang.ProceedingJoinPoint;

public class LogAop {
	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));
		}
	}
}

출력
Student.getStudentInfo() is start.
이름 : 홍길동
나이 : 10
학년 : 3
반 : 5
Student.getStudentInfo()is finished.

Student.getStudentInfo()경과시간 : 21
Worker.getWorkerInfo() is start.
이름 : 홍길순
나이 : 35
학년 : 개발자
Worker.getWorkerInfo()is finished.

profile
건물주가 되는 그날까지

0개의 댓글