SpringAOP⾯向切⾯详解(带实例)
了解AOP的相关术语
1.通知(Advice):
通知定义了切⾯是什么,以及何时使⽤。描述了切⾯要完成的⼯作和何时需要执⾏这个⼯作。
2.连接点(Joinpoint):
程序能够应⽤通知的⼀个“时机”,这些“时机”就是连接点,例如⽅法被调⽤时、异常被抛出时等等。
3.切⼊点(Pointcut):
通知定义了切⾯要发⽣的“故事”和时间,那么切⼊点就定义了“故事”发⽣的地点,例如某个类或⽅法的名称,Spring中允许我们⽅便的⽤正则表达式来指定(切⾯在哪个⽅法的前或后做出的那个⽅法点)
4.切⾯(Aspect):
通知和切⼊点共同组成了切⾯:时间、地点和要发⽣的“故事”,事务管理是J2EE应⽤中⼀个很好的横切关注点例⼦,切⾯⽤Spring的Advisor或实现
5.引⼊(Introduction):
引⼊允许我们向现有的类添加新的⽅法和属性(Spring提供了⼀个⽅法注⼊的功能)
6.⽬标(Target):
即被通知的对象,如果没有AOP,那么它的逻辑将要交叉别的事务逻辑,有了AOP之后它可以只关注⾃⼰要做的事(AOP让他做爱做的事)
7.代理(proxy):
应⽤通知的对象,详细内容参见设计模式⾥⾯的代理模式
8.织⼊(Weaving):
把切⾯应⽤到⽬标对象来创建新的代理对象的过程,织⼊⼀般发⽣在如下⼏个时机:
(1)编译时:当⼀个类⽂件被编译时进⾏织⼊,这需要特殊的编译器才可以做的到,例如AspectJ的织⼊编译器
(2)类加载时:使⽤特殊的ClassLoader在⽬标类被加载到程序之前增强类的字节代码
(3)运⾏时:切⾯在运⾏的某个时刻被织⼊,SpringAOP就是以这种⽅式织⼊切⾯的,原理应该是使⽤了JDK的动态代理技术
存在的实现⽅式
1.经典的基于代理的AOP
2.@AspectJ注解驱动的切⾯
3.纯POJO切⾯
4.注⼊式AspectJ切⾯
实现步骤
1.创建通知:实现这⼏个接⼝,把其中的⽅法实现了
2.定义切点和通知者:在Spring配制⽂件中配置这些信息
3.使⽤ProxyFactoryBean来⽣成代理
范例
<project xmlns="/POM/4.0.0"xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/POM/4.0.0 /maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>imooc</groupId>
<artifactId>springmaven</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>springmaven Maven Webapp</name>
<url></url>
<properties>
<finalName>SSHMJ-FRANK</finalName>
</properties>
<repositories>
<repository>
<id>mav</id>
<name>sss</name>
<url>mvnrepository</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<layout>default</layout>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-asm</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-instrument</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-instrument-tomcat</artifactId> <version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.9</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.5.3</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
spring aop应用场景<artifactId>spring-webmvc-portlet</artifactId> <version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>ognl</groupId>
<artifactId>ognl</artifactId>
<version>2.6.9</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>3.4</version>
</plugin>
</plugins>
</pluginManagement>
<finalName>springmaven</finalName>
</build>
</project>
``l
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="/2001/XMLSchema-instance"xmlns="java.sun/xml/ns/javaee"xsi:schemaLocation="java.sun/x <!--  ⼯程名 -->
<display-name>springmaven</display-name>
<listener>
<listener-class>org.t.ContextLoaderListener</listener-class>
</listener>
<!-- spring配置⽂件的配置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>l</param-value>
</context-param>
<!--  springmvc的配置环境 -->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>l</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
</web-app>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"
xmlns:aop="/schema/aop"xmlns:tx="/schema/tx"
xmlns:task="/schema/task"
xsi:schemaLocation="/schema/beans
/schema/beans/spring-beans-3.0.xsd
/schema/context
/schema/context/spring-context-3.0.xsd
/schema/tx
/schema/tx/spring-tx-3.0.xsd
/schema/aop
/schema/aop/spring-aop-3.0.xsd
/schema/task
/schema/task/spring-task-3.0.xsd">
<context:component-scan base-package="com.service" />
<aop:aspectj-autoproxy />
<aop:config proxy-target-class="true">
<aop:aspect ref="preDo">
<aop:pointcut expression="execution(* com.Eat(..))"
id="register" />
<aop:before method="toPre"pointcut-ref="register" />
</aop:aspect>
</aop:config>
</beans>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。