핵심과 비핵심(부가적인내용)을 분리
주로 보안,트랜잭션,로깅에서 사용함
*핵심적인내용:target
핵심과 비핵심이 연결되는 접합점 - >Joinpoint
매번 사용되는것과 사용되지 않고 갖다쓰는 것을 분리시킴
<<<<<<AOP예제>>>>>>
--------------------------------------------------------------인터페이스--------------MsgBean.java
package Chapter1;
public interface MsgBean {
void sayHello(String name);
void sayHello2(String name);
void sayHello3(String name);
void sayHi(String name);
}
------------------------------------------------pointcut으로설정해줄부가적인---------MsgAdvice.java
package Chapter1;
import org.aspectj.lang.ProceedingJoinPoint;
public class MsgAdvice {
public Object doing(ProceedingJoinPoint invocation)
throws Throwable {
// TODO Auto-generated method stub
long start=System.currentTimeMillis();
System.out.println("start시간...."+start);
Object proc=invocation.proceed(); //이것을 기준으로 전처리 후처리
long end=System.currentTimeMillis();
System.out.println("end시간 : ....."+end);
System.out.println("처리결과시간... "+(end-start));
return proc;
}
}
--------------------------aspect로 설정하기위한 핵심----MsgBeanTarget.java
package Chapter1;
public class MsgBeanTarget implements MsgBean{
@Override
public void sayHello(String name) {
try{
Thread.sleep(500);
}catch(Exception e){
e.printStackTrace();
}
System.out.println("hello"+name);
}
@Override
public void sayHello2(String name) {
try{
Thread.sleep(500);
}catch(Exception e){
e.printStackTrace();
}
System.out.println("sayHello2"+name);
}
@Override
public void sayHello3(String name) {
try{
Thread.sleep(500);
}catch(Exception e){
e.printStackTrace();
}
System.out.println("sayHello3"+name);
}
@Override
public void sayHi(String name) {
try{
Thread.sleep(500);
}catch(Exception e){
e.printStackTrace();
}
System.out.println("sayHi"+name);
}
}
------------------------------------------------------msgMain.java
package Chapter1;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
//maven reposi에서 aspectj검색후 weaver추가
public class msgMain {
public static void main(String[] args) {
String[] path=new String[]{"app1.xml"};
ApplicationContext ctx=new ClassPathXmlApplicationContext(path);
MsgBean mtarget=ctx.getBean("msgBeanTarget",MsgBean.class);
mtarget.sayHello("hong");
mtarget.sayHello2("kim");
mtarget.sayHello3("park");
}
}
----------------------------------------------------어드바이스와 포인트콧이 ------------app.xml
<bean id="msgAdvice" class="Chapter1.MsgAdvice"/>
<bean id="msgBeanTarget" class="Chapter1.MsgBeanTarget"/>
<aop:config> <!-- advisor와 pointcut이 연결되어있음 -->
<aop:aspect id="msgAspect" ref="msgAdvice"> <!-- aspect로 msgAdvice를 연결 (Advice설정)-->
<aop:pointcut expression="execution(public * Chapter1.MsgBeanTarget.*(*))"
id="msgpoint"/> <!—매개변수1개에 타입에 성관없이, 메서드명에 상관없이 포인트컷으로 잡겟다(따라서 MsgBeanTarget클래스의 모든 메서드를 사용가능하도록 함 -->
<aop:around method="doing" pointcut-ref="msgpoint"/> <!-- Before Advice와 After Advice로 msgpoint의 doing메서드를 msgbeanTarget의 메서드를 실행할 때마다 Before, after로 실행하도록 설정(advisor) -->
</aop:aspect>
</aop:config>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
Pointcut을 advice에 연결시켜줌
'SpringFramework' 카테고리의 다른 글
Spring websocket (0) | 2023.12.10 |
---|---|
spring batch (0) | 2023.02.06 |
SpringFramework (0) | 2018.02.03 |
MVC,spring (0) | 2012.09.04 |
Spring01정리 (0) | 2012.06.01 |