관리 메뉴

개발 노트

10/19 Bean, AOP 개념 본문

프로젝트 기반 JAVA 응용 SW개발 : 22.07.19~23.01.20/Spring

10/19 Bean, AOP 개념

hayoung.dev 2022. 10. 26. 12:13

[env03]

AdminConnection(class, InitalzingBean, DisposableBean 상속)

package env03;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class AdminConnection implements InitializingBean, DisposableBean {
	private String adminId;
	private String adminPw;
	private String sub_adminId;
	private String sub_adminPw;

	public void destroy() throws Exception {
		System.out.println("AdminConnection destory() 소멸자 소멸 전...");

	}

	public void afterPropertiesSet() throws Exception {
		System.out.println("AdminConnection afterPropertiesSet() 생성자 생성 이후...");

	}

	public String getAdminId() {
		return adminId;
	}

	public void setAdminId(String adminId) {
		this.adminId = adminId;
	}

	public String getAdminPw() {
		return adminPw;
	}

	public void setAdminPw(String adminPw) {
		this.adminPw = adminPw;
	}

	public String getSub_adminId() {
		return sub_adminId;
	}

	public void setSub_adminId(String sub_adminId) {
		this.sub_adminId = sub_adminId;
	}

	public String getSub_adminPw() {
		return sub_adminPw;
	}

	public void setSub_adminPw(String sub_adminPw) {
		this.sub_adminPw = sub_adminPw;
	}
	
	

}

ApplicationConfig (class) : env02에서 했던 xml 파일과 같은 역할을 한다.

외부에 있는 키, value 값을 편하게 내부로 가져오는 코드이다.

package env03;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

/*@Configuration : 환경설정*/
@Configuration
public class ApplicationConfig {
	
	@Value("${admin.id}")
	private String adminId;
	@Value("${admin.pw}")
	private String adminPw;
	@Value("${sub_admin.id}")
	private String sub_adminId;
	@Value("${sub_admin.pw}")
	private String sub_adminPw;
	
	/* Bean은 객체임 */
	@Bean
	/* Properties작업(환경작업)이 있다면 생성자처럼 내부에서 자동으로 호출된다. Properties를 리턴하는 객체가 있는지 찾는다. */
	public static PropertySourcesPlaceholderConfigurer Properties() {
		PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
		System.out.println("2. Properties Run..");
		Resource[] locations = new Resource[2];
		locations[0] = new ClassPathResource("admin3.properties");
		locations[1] = new ClassPathResource("sub_admin3.properties");
		configurer.setLocations(locations);
		return configurer;	
	}

	@Bean
	public AdminConnection adminConfig() {
		AdminConnection adminConnection = new AdminConnection();
		System.out.println("3. adminConfig Run");
		adminConnection.setAdminId(adminId);
		adminConnection.setAdminPw(adminPw);
		adminConnection.setSub_adminId(sub_adminId);
		adminConnection.setSub_adminPw(sub_adminPw);
		
		return adminConnection;
	}
}

EnvMainClass03 (class, main)

package env03;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class EnvMainClass03 {

	public static void main(String[] args) {
		System.out.println("1 EnvMainClass03 Run...");
		AnnotationConfigApplicationContext ctx = 
				new AnnotationConfigApplicationContext(ApplicationConfig.class);
		System.out.println("4 EnvMainClass03 adminConfig Before Run");
		AdminConnection connection = ctx.getBean("adminConfig", AdminConnection.class);
		System.out.println("5 EnvMainClass03 adminConfig After Run");
				
		System.out.println("connection.getAdminId adminID : " + connection.getAdminId());
		System.out.println("connection.getAdminPw adminPW : " + connection.getAdminPw());
		System.out.println("connection.getSub_adminId() sub_adminID : " + connection.getSub_adminId());
		System.out.println("connection.getSub_adminPw() sub_adminPW : " + connection.getSub_adminPw());
		ctx.close();
		
	}

}

src/main/resources > admin3.properties (file)

admin.id=super
admin.pw=12345

src/main/resources > sub_admin3.properties (file)

sub_admin.id=sub3
sub_admin.pw=67890

출력 결과

 

[env04] : 개발환경 기능과 실행환경 기능을 따로 만들어놓고 사용자가 선택하게 하여 실행되게 함.

ServerInfo(class)

package env04;

public class ServerInfo {
	private String ipNum;
	private String portNum;
	
	public String getIpNum() {
		return ipNum;
	}
	public void setIpNum(String ipNum) {
		this.ipNum = ipNum;
	}
	public String getPortNum() {
		return portNum;
	}
	public void setPortNum(String portNum) {
		this.portNum = portNum;
	}

}

EnvMainClass04 (class)

package env04;

import java.util.Scanner;

import org.springframework.context.support.GenericXmlApplicationContext;

public class EnvMainClass04 {

	public static void main(String[] args) {
		String config = null;
		System.out.println("System을 입력하세요? dev OR run");
		Scanner scanner = new Scanner(System.in);
		String str = scanner.next();
		if(str.equals("dev")) {
			config = "dev";
		} else if(str.equals("run")) {
			config = "run";
		}
		
		scanner.close();
		
		GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
		//활성화시킨다.
		ctx.getEnvironment().setActiveProfiles(config);
		ctx.load("applicationCTX_dev.xml", "applicationCTX_run.xml");
		
		ctx.refresh();
		
		ServerInfo info = ctx.getBean("serverInfo", ServerInfo.class);
		System.out.println("ip : " + info.getIpNum());
		System.out.println("port : " + info.getPortNum());
		ctx.close();
		
	}

}

src/main/resources > applicationCTX_dev.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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" 
	profile="dev">
	
	<bean id="serverInfo" class="env04.ServerInfo">
	     <property name="ipNum"   value="localhost"></property>
	     <property name="portNum" value="8181"></property>
	</bean>


</beans>

src/main/resources > applicationCTX_run.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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" 
	profile="run">

  <bean id="serverInfo" class="env04.ServerInfo">
	     <property name="ipNum"   value="172.30.1.93"></property>
	     <property name="portNum" value="8080"></property>
  </bean>

</beans>

출력 결과 (dev 입력)

출력 결과 (run 입력)

 

[AOP 개념]

 

(중요)

 

<och06_AOP1>

 

pom.xml : 구글링해서 라이브러리 세팅

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.springframework.samples</groupId>
  <artifactId>com.oracle.aop1</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <properties>

		<!-- Generic properties -->
		<java.version>1.8</java.version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

		<!-- Spring -->
		<spring-framework.version>3.2.3.RELEASE</spring-framework.version>

		<!-- Hibernate / JPA -->
		<hibernate.version>4.2.1.Final</hibernate.version>

		<!-- Logging -->
		<logback.version>1.0.13</logback.version>
		<slf4j.version>1.7.5</slf4j.version>

		<!-- Test -->
		<junit.version>4.11</junit.version>

	</properties>
	
	<dependencies>
		<!-- Spring and Transactions -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring-framework.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${spring-framework.version}</version>
		</dependency>

		<!-- Logging with SLF4J & LogBack -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${slf4j.version}</version>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>${logback.version}</version>
			<scope>runtime</scope>
		</dependency>

		<!-- Hibernate -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-entitymanager</artifactId>
			<version>${hibernate.version}</version>
		</dependency>

		
		<!-- Test Artifacts -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${spring-framework.version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>
			<scope>test</scope>
		</dependency>
		
		<!-- AOP -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.8.2</version>
		</dependency>

	</dependencies>	
</project>

 

[aop1]

Student (class)

package aop1;

public class Student {
	private String name;
	private int age;
	private int gradeNum;
	private int classNum;
	
	public void getStudentInfo() {
	      System.out.println("name "+ getName());
	      System.out.println("age "+getAge());
	      System.out.println("gradeNum "+ getGradeNum());
	      System.out.println("classNum "+ 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 (class)

package aop1;

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 (class)

package aop1;

import org.aspectj.lang.ProceedingJoinPoint;

public class LogAop {
	//Around Advice에서 사용할 공통기능 메서드는,
	//대부분 파라미터로 전달받은 ProceedingJoinPoint의 proceed() 메서드만 호출.
	public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable{
		//핵심 관심사의 Method를 가져올 때 하단 코드 사용
		String signatureStr = joinpoint.getSignature().toShortString();
		System.out.println(signatureStr + "is start...");
		long startTime = System.currentTimeMillis();
		
		Object obj;
		try {
			//joinpoint : 핵심관심사의 Method. 그것을 수행(proceed)한다.
			obj = joinpoint.proceed();
			return obj;
		} finally {
			long endTime = System.currentTimeMillis();
			System.out.println(signatureStr + "is finished.");
			System.out.println(signatureStr + "경과시간 : " + (endTime - startTime));
		}
	}
}

AopMainClass01 (class)

package aop1;

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

public class AopMainClass01 {

	public static void main(String[] args) {
		AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationCTX01.xml");
		
		Student student = ctx.getBean("student", Student.class);
		student.getStudentInfo();
		
		Worker worker = ctx.getBean("worker", Worker.class);
		worker.getWorkerInfo();
		ctx.close();

	}

}

resource > applicationCTX01.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.2.xsd">

	<bean id="logAop" class="aop1.LogAop"></bean>
	
	<!-- aop:config는 AOP의 전체 설정 감싸는 태그 -->
	<aop:config>
		<!-- aop:aspect는 핵심 관심 포인트컷과 횡단 관심 어드바이스를 결합하는 것. -->
		<aop:aspect id="logger1" ref="logAop">
			<!-- aop:pointcut은 포인트컷을 지정하여 선택된 메소드. -->
			<!-- aop 안에 있는 모든 것이 실행되면 띄운다. -->
			<aop:pointcut expression="within(aop1.*)" id="pointcut1"/>
			<!-- aop1.S~ 인 것이 실행된다. 즉 aop1.Student만 실행되고 aop1.Worker는 실행되지 않는다. -->
			<!-- 이 기능을 통해 코드의 흐름을 제어하거나 성능 측정을 할 수 있다. -->
			<!-- <aop:pointcut expression="within(aop1.S*)" id="pointcut1"/> -->
			<aop:around method="loggerAop" pointcut-ref="pointcut1"/>
		</aop:aspect>
	</aop:config>
	
	<bean id="student" class="aop1.Student" >
		<property name="name" value="연개소문" />
		<property name="age" value="50" />
		<property name="gradeNum" value="3" />
		<property name="classNum" value="5" />
	</bean>
	
	<bean id="worker" class="aop1.Worker" >
		<property name="name" value="이순신" />
		<property name="age" value="35" />
		<property name="job" value="개발자" />
	</bean>	
	
	
	

</beans>

출력 결과

 

<och06_AOP2>

java > aop2.buz (package, 핵심관심사 이 패키지에 몰아 작성)

aop2.buz > Student (class)

package aop2.buz;

public class Student {
	private String name;
	private int age;
	private int gradeNum;
	private int classNum;

	public Student() {
		System.out.println("Student 생성자");
	}

	public void getStudentInfo() {
		System.out.println("이름 : " + getName());
		System.out.println("나이 : " + getAge());
		System.out.println("학년 : " + getGradeNum());
		System.out.println("반 : " + getClassNum());
		// 오류를 일부러 발생시켜 실행되는지 확인하는 것. 오류가 발생하면 afterThrowingAdvice() 실행됨.
		//System.out.println(10/0);
	}

	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;
	}

	
	
	
	
}

aop2.buz > Worker (class)

package aop2.buz;

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;
	}

	

}

aop2 > LogAop (class)

package aop2;

import org.aspectj.lang.ProceedingJoinPoint;

public class LogAop {
	//시간 측정 코드
	public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable {
		// 핵심업무에 사용 method
		String signatureStr  = joinpoint.getSignature().toString();
		long st = System.currentTimeMillis();
		System.out.println( signatureStr + " is start...");	
		
		try {
			//핵심업무 ( aop2.buz.Student.getStudentInfo()) 실행
			Object obj = joinpoint.proceed();
			return obj;
		} finally {
			long et = System.currentTimeMillis();
			System.out.println( signatureStr + " is finished.");
			System.out.println( signatureStr + " 경과시간 : " + (et - st));
		}
	}

	public void beforeAdvice() {
		System.out.println("beforeAdvice()");
	}
	
	public void afterReturningAdvice() {
		System.out.println("afterReturningAdvice()");
	}
	
	public void afterThrowingAdvice() {
		System.out.println("afterThrowingAdvice()");
	}
	
	public void afterAdvice() {
		System.out.println("afterAdvice()");
	}
	
	
	

}

aop2 > AopMainClass02 (class, main)

package aop2;

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

import aop2.buz.Student;
import aop2.buz.Worker;

public class AopMainClass02 {

	public static void main(String[] args) {
		AbstractApplicationContext ctx = 
				new GenericXmlApplicationContext("classpath:applicationCTX02.xml");
		
		Student student = ctx.getBean("student", Student.class);
		student.getStudentInfo();
		
		Worker worker = ctx.getBean("worker", Worker.class);
		worker.getWorkerInfo();
		
		ctx.close();
	}

}

resource > applicationCTX02.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.2.xsd">

    <bean id="logAop" class="aop2.LogAop"></bean>
    <aop:config>
    	<aop:aspect id="logger" ref="logAop">
    	   <aop:pointcut expression="within(aop2.buz.*)" id="pointcut1"/>
		   <!-- pointcut1이 실행이 되면, 즉 within(aop2.buz.*)가 실행이 되면 LoaAop.java의 loggerAop 이벤트를 실행시킨다. -->
    	   <aop:around method="loggerAop" pointcut-ref="pointcut1"/>
     	</aop:aspect>
        <aop:aspect id="logger" ref="logAop">
        	<aop:pointcut expression="within(aop2.buz.*)" id="pointcut2"/>
            <aop:before method="beforeAdvice" pointcut-ref="pointcut2"/>
        </aop:aspect>
        <aop:aspect id="logger" ref="logAop">
        	<aop:pointcut expression="within(aop2.buz.*)" id="pointcut3"/>
            <aop:after-throwing method="afterThrowingAdvice" pointcut-ref="pointcut3"/>
        </aop:aspect>
        <aop:aspect id="logger" ref="logAop">
        	<aop:pointcut expression="within(aop2.buz.*)" id="pointcut4"/>
            <aop:after method="afterAdvice" pointcut-ref="pointcut4"/>
        </aop:aspect>
    </aop:config>

	<bean id="student" class="aop2.buz.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="aop2.buz.Worker" >
		<property name="name" value="김유신" />
		<property name="age" value="35" />
		<property name="job" value="개발자" />
	</bean>

</beans>

 

출력 결과 (오류 안난 경우)

출력 결과 (오류 난 경우)

 

 

<och06_AOP3>

java > aop3.buz(package) > Student(class)

package aop3.buz;

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 void get3StudentInfo() {
		System.out.println("이름3 : " + getName());
		System.out.println("나이3 : " + getAge());
		System.out.println("학년3 : " + getGradeNum());
		System.out.println("반 3: " + 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;
	}
	
}

java > aop3.buz(package) > Worker(class)

package aop3.buz;

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;
	}

}

java > aop3(package) > LogAop(class)

package aop3;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
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
public class LogAop {
	// aop3.buz 패키지 안에 있는 모든 메소드를 Pointcut한다.
	@Pointcut("within(aop3.buz.*)")
	//Pointcut 메소드 생성
	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(aop3.buz.*)")
	public void beforeAdvice() {
		System.out.println("beforeAdvice()");
	}
    @After("within(aop3.buz.*)")
	public void afterAdvice() {
		System.out.println("AfterAdvice()");
	}	
}

java > aop3(package) > AopMainClass03(class)

package aop3;

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

import aop3.buz.Student;

public class AopMainClass03 {

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

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

	}

}

resources > applicationCTX03.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.2.xsd">

    <aop:aspectj-autoproxy/>
    <bean id="logAop" class="aop3.LogAop"></bean>
   
	<bean id="student" class="aop3.buz.Student" >
		<property name="name" value="홍길동" />
		<property name="age" value="10" />
		<property name="gradeNum" value="3" />
		<property name="classNum" value="5" />
	</bean>

</beans>

출력 결과

반응형