**AspectJ的XML方式完成AOP的开发**
1. AspectJ的XML的方式的快速入门,前面的步骤都是一样的
2. 具体的开发步骤
1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包
* 先引入Spring框架开发的基本开发包,还需要引入AOP的开发包(AOP联盟和AOP的开发包)
* 再引入AspectJ的开发包
* aspectj 本身jar包 -- com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
* spring支持aspectj的包 -- spring-aspects-3.2.0.RELEASE.jar
2. 步骤二:创建Spring的配置文件,引入具体的AOP的schema约束
<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.xsd">
3. 步骤三:创建包结构,编写具体的实现类代码
* com.itheima.demo2
* OrderDao
4. 步骤四:将目标类配置到Spring中
<!-- 目标类 -->
<bean id="orderDao" class="com.itheima.demo2.OrderDao"/>
5. 步骤五:定义切面(注意不用使用注解了)
public class MyAspectXml {
public void myBefore(){
System.out.println("前置通知====");
}
}
6. 步骤六:在配置文件中定义切面类
<bean id="myAspectXml" class="com.itheima.demo2.MyAspectXml"/>
7. 步骤七:在配置文件中完成aop的配置
<!-- 配置aop -->
<aop:config>
<!-- 先定义切入点 -->
<aop:pointcut expression="execution(public * com.itheima.demo2.OrderDao.save(..))" id="myPointcut"/>
<!-- 定义切面 -->
<aop:aspect ref="myAspectXml">
<!-- 配置通知的类型,还需要配置引入哪一个切入点 -->
<aop:before method="myBefore" pointcut-ref="myPointcut"/>
</aop:aspect>
</aop:config>
8. 完成测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext2.xml")
public class SpringDemo2 {
@Resource(name="orderDao")
private OrderDao orderDao;
@Test
public void run1(){
orderDao.save();
}
}
----------
**AspectJ的XML方式的AOP的通知类型的配置**
1. 测试后置通知
* 在切面类中编写方法
public void myAfterReturnint(Object result){
System.out.println("后置通知===="+result);
}
* 在配置文件中编写具体的配置
<aop:after-returning method="myAfterReturnint" pointcut-ref="myPointcut2" returning="result"/>
2. 测试环绕通知
* 在切面类中编写方法
public void myAroundt(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("方法之前通知====");
joinPoint.proceed();
System.out.println("方法之后通知====");
}
* 在配置文件中编写具体的配置
<aop:around method="myAroundt" pointcut-ref="myPointcut2"/>
3. 测试异常抛出
* 在切面类中编写方法
public void myThrowable(Throwable e){
System.out.println("异常通知===="+e.getMessage());
}
* 在配置文件中编写具体的配置
<aop:after-throwing method="myThrowable" pointcut-ref="myPointcut3" throwing="e"/>
4. 测试最终通知
* 在切面类中编写方法
public void myAfter(){
System.out.println("最终通知====");
}
* 在配置文件中编写具体的配置
<aop:after method="myAfter" pointcut-ref="myPointcut3"/>
applicationContext.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.xsd">
<bean id="orderDao" class="demo1.OrderDao"></bean>
<!-- 定义切面类 -->
<bean id="myAspectXml" class="demo1.MyAspectXml"></bean>
<!-- 完成aop的配置 -->
<aop:config>
<!-- 先定义切入点 -->
<aop:pointcut expression="execution(public * demo1.OrderDao.save(..))" id="myPointcut"/>
<aop:pointcut expression="execution(public * demo1.OrderDao.update(..))" id="myPointcut2"/>
<aop:pointcut expression="execution(public * demo1.OrderDao.delete(..))" id="myPointcut3"/>
<!-- 定义切面 -->
<aop:aspect ref="myAspectXml">
<!-- 配置 通知的类型,还需要配置引入哪一个切入点 -->
<aop:before method="myBefore" pointcut-ref="myPointcut"/>
<aop:after-returning method="myAfterReturning" pointcut-ref="myPointcut2" returning="result"/>
<aop:around method="myAround" pointcut-ref="myPointcut3"/>
</aop:aspect>
</aop:config>
</beans>
MyAspectXml:
package demo1;
import org.apache.tomcat.util.collections.SynchronizedStack;
import org.aspectj.lang.ProceedingJoinPoint;
public class MyAspectXml {
public void myBefore(){
System.out.println("前置通知====");
}
public void myAfterReturning(Object result){
System.out.println("后置通知======"+result);
}
public void myAround(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("方法之前通知====");
joinPoint.proceed();
System.out.println("方法之后通知====");
}
public void myThrowable(Throwable e){
System.out.println("异常通知===="+e.getMessage());
}
}
OrderDao:
package demo1;
public class OrderDao {
public void save() {
System.out.println("保存订单");
}
public String update(){
System.out.println("修改订单...");
return "修改订单成功哦爷!";
}
public void delete(){
System.out.println("删除订单...");
}
public void find(){
System.out.println("查询订单...");
}
}
SpringDemo1:
package demo1;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringDemo1 {
@Resource(name="orderDao")
private OrderDao orderDao;
@Test
public void run1(){
orderDao.save();
orderDao.update();
orderDao.delete();
}
}
转载于:https://www.cnblogs.com/syj1993/p/8603501.html