spring aop 두 가지 설정 방식
메모 구성 AOP(AspectJ 클래스 라이브러리를 사용하여 구현됨)는 크게 세 단계로 나뉩니다.
1. 메모 @Aspect를 사용하여 탄젠트를 정의하고 탄젠트(@Pointcut), 알림 유형(@Before, @AfterReturning, @After, @AfterThrowing, @Around)을 탄젠트에 정의합니다.
2. 차단해야 할 종류를 개발한다.
3. 절단면을 xml에 배치하면 물론 우리는 자동으로 Bean을 스캔하는 방식을 사용할 수 있다.그러면 Spring AoP 컨테이너에서 관리합니다.
또한aspectJ의jar가방:aspectjweaver를 인용해야 합니다.jar aspectjrt.jar
인스턴스:
User.java
package com.bjsxt.model;
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
/**
*
*/
package com.bjsxt.dao;
import com.bjsxt.model.User;
public interface UserDAO {
public void save(User user);
}
구현 인터페이스:
package com.bjsxt.dao.impl;
import org.springframework.stereotype.Component;
import com.bjsxt.dao.UserDAO;
import com.bjsxt.model.User;
@Component("u")
public class UserDAOImpl implements UserDAO {
public void save(User user) {
System.out.println("user save11d!");
/*throw new RuntimeException("exception");*/ //
}
}
작업 클래스:
package com.bjsxt.service;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import com.bjsxt.dao.UserDAO;
import com.bjsxt.model.User;
@Component("userService")
public class UserService {
private UserDAO userDAO;
public void init() {
System.out.println("init");
}
public void add(User user) {
userDAO.save(user);
}
public UserDAO getUserDAO() {
return userDAO;
}
@Resource(name="u")
public void setUserDAO( UserDAO userDAO) {
this.userDAO = userDAO;
}
public void destroy() {
System.out.println("destroy");
}
}
aop 가입
package com.bjsxt.aop;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LogInterceptor {
@Pointcut("execution(public * com.bjsxt.service..*.add(..))")
public void myMethod(){};
/*@Before("execution(public void com.bjsxt.dao.impl.UserDAOImpl.save(com.bjsxt.model.User))")*/
@Before("myMethod()")
public void before() {
System.out.println("method staet");
}
@After("myMethod()")
public void after() {
System.out.println("method after");
}
@AfterReturning("execution(public * com.bjsxt.dao..*.*(..))")
public void AfterReturning() {
System.out.println("method AfterReturning");
}
@AfterThrowing("execution(public * com.bjsxt.dao..*.*(..))")
public void AfterThrowing() {
System.out.println("method AfterThrowing");
}
}
프로파일
<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
"><!-- 2 -->
<context:annotation-config />
<context:component-scan base-package="com.bjsxt"/> <!-- -->
<aop:aspectj-autoproxy/> <!-- -->
</beans>
테스트 클래스:
package com.bjsxt.service;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.bjsxt.model.User;
//Dependency Injection
//Inverse of Control
public class UserServiceTest {
@Test
public void testAdd() throws Exception {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService service = (UserService)ctx.getBean("userService");
System.out.println(service.getClass());
service.add(new User());
System.out.println("###");
ctx.destroy();
}
}
결과:
class com.bjsxt.service.UserService$$EnhancerByCGLIB$$7b201784
method staet
user save11d!
method AfterReturning
method after
###
참고:@Aspect: 이 클래스가 절단면류라는 뜻이에요.
@Componet: 절단면류로 Spring을 관리해야 하기 때문에 초기화할 때 이 클래스를 Spring의 관리에 초기화해야 합니다.
@Befoe: 접점에 대한 논리(Advice)
execution...: 삽입점 문법
두 번째: xml 설정 aop
인스턴스와 동일: 구성 파일만 다를 뿐
<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
"><!-- 2 -->
<context:annotation-config />
<context:component-scan base-package="com.bjsxt"/>
<bean id="logInterceptor" class="com.bjsxt.aop.LogInterceptor"></bean>
<aop:config>
<aop:pointcut expression="execution(public * com.bjsxt.service..*.add(..))"
id="servicePointcut"/>
<aop:aspect id="logAspect" ref="logInterceptor">
<aop:before method="before" pointcut-ref="servicePointcut" />
</aop:aspect>
</aop:config>
</beans>
다음 xmlns:
기본 xml 문서 해석 형식, 즉spring의 beans입니다.주소http://www.springframework.org/schema/beans.
이 속성을 설정하면 beans에서 설명한 모든 속성은 <>를 통해 직접 사용할 수 있습니다. 예를 들어
xmlns:xsi:
xml이 준수해야 할 규범입니다. URL을 통해 알 수 있듯이 w3의 통일된 규범입니다. 뒤에 xsi:schemaLocation을 통해 모든 해석 파일을 포지셔닝합니다.
xmlns:aop:
이것은 중점이다. 우리가 여기서 사용해야 할 의미 규범이다. 이것은 절단면 AOP와 관련이 있다.
xmlns:tx:
Spring의 트랜잭션 관련 구성 내용입니다.
XML 파일은 기본 의미 해석의 사양명세만 선언할 수 있습니다.
예를 들어 위의 xml에는 beans 하나만 기본이고 다른 것은 모두 특정한 탭을 통해 사용해야 한다. 예를 들어 aop은 자체적으로 많은 속성을 가지고 있다. 만약에 사용하려면 앞에 aop:xx를 추가해야 한다.예를 들어 위의 aop:config.
이와 유사하게 기본 xmlns가 aop와 관련된 의미 해석 규범을 설정하면 xml에서config라는 라벨을 직접 쓸 수 있습니다.
이상은spring aop 두 가지 설정 방식입니다. 아시겠어요?이후spring aop 두 가지 설정 방식에 대한 글이 더 많이 올라와 있으니 계속 지켜봐 주세요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.