Spring 프레임 워크의 중요한 지식 요약 (3)

1. AOP 란 무엇입니까?

1. AOP (Aspect Oriented Programming)는 비즈니스 로직의 다양한 부분을 분리하여 비즈니스 로직의 다양한 부분 간의 결합을 줄이고 프로그램의 재사용 성을 개선하며 개발 효율성을 향상시킵니다.
2. AOP는 기존 수직 상속 시스템 (성능 모니터링, 트랜잭션 관리, 보안 검사, 캐싱)의 반복 코드를 대체하기 위해 수평 추출 메커니즘을 채택합니다.

2. 왜 AOP를 배워야합니까?

소스 코드를 수정하지 않고도 운영 중에 기존 메소드를 향상시킬 수 있기 때문입니다.

3. AOP의 장점은 무엇입니까?

  1. 반복되는 코드 감소 2. 개발 효율성 제공 3. 편리한 유지 보수

넷, AOP의 기본 원칙

JDK의 동적 프록시 기술 (주로)

1. 인터페이스에 대한 프록시 클래스의 바이트 코드 파일을 만듭니다.
2. ClassLoader를 사용하여 바이트 코드 파일을 JVM에로드합니다.
3. 프록시 클래스의 인스턴스 객체를 만들고 객체의 대상 메서드를 실행합니다.

cglib 프록시 기술

다섯, AOP 관련 용어

연결 지점 (연결 지점) 소위 연결 지점은 가로채는 지점을 나타냅니다. Spring은 메소드 유형의 연결 지점 만 지원하기 때문에 Spring의 모든 메소드를 참조합니다.

Pointcut (pointcut) -(pointcut 표현식 쓰기), 프로그램 향상 항목.

Advice (정보 / 향상)- 봄에 방법을 강화하기 위해 트랜잭션 관리 관련 코드를 작성합니다.

대상- 에이전트 의 대상

제직 대상 객체에 향상된 기능을 적용하는 과정에 -refers 것은 새 프록시 개체를 만들 수

프록시 -AOP에 의해 클래스가 짜여지고 강화 된 후 결과 프록시 클래스가 생성됩니다.

Aspect = 진입 점 + 알림

여섯, 참가 신청 케이스

(1) 먼저 다음 단계에 대해 간단히 이야기

새로운 좌표 AOP, Spring-aspects, aspect 도입, 구성 파일에 특정 AOP 제약 사항 도입, 패키지 구조 작성, 특정 인터페이스 및 구현 클래스 작성, 대상 클래스 삽입, aspect 클래스 정의, 구성 파일에서 측면 클래스 주입, 완전한 AOP 구성, 테스트

(2) 특정 구현

① 새로운 좌표 AOP, Spring-aspects, aspect를 소개합니다.

    <dependency>
        <groupId>aopalliance</groupId>
        <artifactId>aopalliance</artifactId>
        <version>1.0</version>
    </dependency>
    <!-- Spring Aspects -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
    <!-- aspectj -->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.3</version>
    </dependency>

② 구성 파일은 특정 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.xsd
                http://www.springframework.org/schema/context
                http://www.springframework.org/schema/context/spring-context.xsd
                http://www.springframework.org/schema/aop
                http://www.springframework.org/schema/aop/spring-aop.xsd">

③ 패키지 구조를 작성하고, 특정 인터페이스와 구현 클래스를 작성합니다.

接口:
package demo3;
public interface UserService {
    public void save();
}
实现类:
package demo3;
public class UserServiceImpl implements UserService {
    public void save() {
        System.out.println("业务层:保护用户...");
    }
}

④ 대상 클래스를 삽입합니다.

<bean id="userService2" class="demo3.UserServiceImpl">

⑤ 측면 범주를 정의합니다.

package demo3;
/*
* 自定义切面类 = 切入点(表达式) + 通知(增强的代码)
* */
public class MyXmlAspect {
    /*通知*/
    public void log(){
        System.out.println("增强的方法执行了......");
    }
}

⑥ 구성 파일에 패싯을 삽입합니다.

<bean id="myXmlAspect" class="demo3.MyXmlAspect"/>

⑦ 완전한 AOP 구성;

<!--
             切入点的表达式:
                   execution() 固定的写法
                   public          是可以省略不写的
                   方法的返回值      int String 通用的写法,可以编写 * 不能省略不写的
                   包名+类名        不能省略不写的,编写 *  UserServiceImpl AccountServiceImpl
                   方法名称         save() 可以写 *
                   参数列表         (..) 表示任意类型和个数的参数
                   比较通用的表达式:execution(public * cn.tx.*.*ServiceImpl.*(..))
            -->

<aop:config>
            <!--配置切面 = 切入点 + 通知组成-->
            <aop:aspect ref="myXmlAspect">
                <!--前置通知-->
                <aop:before method="log" pointcut="execution(public * demo3.UserServiceImpl.save(..)))"/>
            </aop:aspect>
</aop:config>

⑧ 테스트 용 테스트 클래스 작성

//运行单元测试  切记需要单元测试环境  导入spring-test
@RunWith(SpringJUnit4ClassRunner.class)
//加载类路径下的配置文件
@ContextConfiguration("classpath:applicationContext4.xml")
public class demo4 {
    //按照类型自动导入
    @Autowired
    private UserService userService;

    /*测试*/
    @Test
    public void run(){
        userService.save();
    }
}

(3) AOP 알림 유형

<!--
                AOP的通知类型
                    前置通知:目标方法执行前,进行增强。
                        <aop:before method="log" pointcut="execution(* cn.tx.*.*ServiceImpl.save*(..))" />
                    最终通知:目标方法执行成功或者失败,进行增强。
                        <aop:after method="log" pointcut="execution(* cn.tx.*.*ServiceImpl.save*(..))" />
                    后置通知:目标方法执行成功后,进行增强。
                        <aop:after-returning method="log" pointcut="execution(* cn.tx.*.*ServiceImpl.save*(..))" />
                    异常通知:目标方法执行失败后,进行增强。
                        <aop:after-throwing method="log" pointcut="execution(* cn.tx.*.*ServiceImpl.save*(..))" />
                    环绕通知:目标方法执行前后,都可以进行增强。目标对象的方法需要手动执行。
            -->

Seven, Spring의 AOP 기술 주석 방법

위의 1을 기반으로
@Aspect 주석을 aspect 클래스에 추가하고, 향상된 메소드를 작성하고, 알림 유형 주석 선언을 사용하십시오.

@Component  // 把该类交给IOC去管理
@Aspect     // 声明是切面类  == <aop:aspect ref="myXmlAspect">
public class MyXmlAspect {

    /*通知*/
    // @Before(value = "切入点的表达式")
    @Before(value = "execution(public * demo3.UserServiceImpl.save(..))")
    public void log(){

        System.out.println("增强的方法执行了......");
    }
}

2. 구성 파일에서 자동 프록시를 켭니다.

<!--开启注解扫描-->
        <context:component-scan base-package="demo3"/>

        <!--开启自动代理--> c
        <aop:aspectj-autoproxy/

Eight, Spring의 AOP 기술-순수 주석 방법

알림 유형 주석 @Before
– 사전 알림
@AfterReturing – post-notification
@Around – 주변 알림 (대상 객체 메서드는 기본적으로 실행되지 않으며 수동으로 실행해야 함)
@After – 최종 알림
@AfterThrowing – 예외 발생 알림

구성 클래스 작성

@Configuration      // 配置类
@ComponentScan(value = "cn.tx.demo3")   // 扫描包
@EnableAspectJAutoProxy     // 开启自动代理 == <aop:aspectj-autoproxy />
public class SpringConfig {
    
}

Spring 프레임 워크의 중요한 지식 요약 (4) .

추천

출처blog.csdn.net/javaScript1997/article/details/108060839