1 AspectJ的XML的方式
1.1创建web项目,引入jar包
除了基本包外(https://blog.csdn.net/W2612888/article/details/85217984),还需要引入下面的包:
- com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar:AspectJ的包
- 弹簧方面,4.2.4.RELEASE.jar:春季和AspectJ的整合的包
- 弹簧AOP-4.2.4.RELEASE.jar:春天的AOP的包
- com.springsource.org.aopalliance-1.0.0.jar:AOP联盟包
1.2创建Spring的配置文件并引入aop约束
在XSD-configuration.xml文件中找到AOP的约束,并引入applicationContext.xml中中
1.3配置编写接口和实现类
- 接口
package com.itykd.dao;
public interface UserDao {
void save();
void update();
void find();
void delete();
}
- 实现类
package com.itykd.dao.impl;
import com.itykd.dao.UserDao;
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println(\"UserDaoImpl的save方法执行了.....\");
}
@Override
public void update() {
System.out.println(\"UserDaoImpl的update方法执行了.....\");
}
@Override
public void find() {
System.out.println(\"UserDaoImpl的find方法执行了.....\");
}
@Override
public void delete() {
System.out.println(\"UserDaoImpl的delete方法执行了.....\");
}
}
- 目标类的配置
<bean id=\"userDao\" class=\"com.itykd.dao.impl.UserDaoImpl\" />
1.4编写一个切面类并交给Spring管理
- 编写切面
package com.itykd.aspect;
public class MyAspectXML {
public void checkPri() {
System.out.println(\"权限校验.......\");
}
}
- 将切面交给春
<bean id=\"myAspect\" class=\"com.itykd.aspect.MyAspectXML\"/>
1.5通过AOP配置实现增强(这里以前置通知为例)
<!-- 通过AOP的配置完成对目标产生代理 -->
<aop:config>
<!-- 表达式配置哪些类型的方法需要增强 -->
<aop:pointcut expression=\"execution(* com.itykd.dao.impl.UserDaoImpl.save(..))\" id=\"pointcut1\"/>
<!-- 配置切面 -->
<aop:aspect ref=\"myAspect\">
<aop:before method=\"checkPri\" pointcut-ref=\"pointcut1\"/>
</aop:aspect>
</aop:config>
1.5编写测试类
Spring能够整合Junit测试,但是需要引入spring-test-4.2.4.RELEASE.jar。
package com.itykd.spring;
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;
import com.itykd.dao.UserDao;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(\"classpath:applicationContext.xml\")
public class SpringAopDemo {
@Resource(name=\"userDao\")
private UserDao userDao;
@Test
public void demo() {
userDao.save();
userDao.find();
userDao.update();
userDao.delete();
}
}
Spring的其他通知和切入表达式的写法见:https://blog.csdn.net/W2612888/article/details/85229101
2 基于AspectJ的注解的AOP开发
2.1 创建项目,引入jar包
- 引入跟上述xml方式开发的jar包
2.2 引入配置文件
- 引入applicationContext.xml文件
2.3 编写并配置配置目标类
- spring的aop底层采用了JDK动态代理和cglib,上述xml方式的增强采用了接口,因此Spring的底层会选择JDK的动态代理作为实现;这里选择另一种实现方法:cglib
- 目标类
package com.itykd.dao;
public class OrderDao {
public void save() {
System.out.println(\"保存订单....\");
}
public void update() {
System.out.println(\"修改订单....\");
}
public void find() {
System.out.println(\"查询订单....\");
}
public void delete() {
System.out.println(\"删除订单....\");
}
}
- 配置目标类
<bean id=\"orderDao\" class=\"com.itykd.dao.OrderDao\"/>
2.4 编写切面类并配置
-
这里还是以前置通知为例
-
编写切面类
package com.itykd.aspect;
public class MyAspect {
public void before() {
System.out.println(\"前置增强===\");
}
}
- 配置切面类
<bean id=\"myAspect\" class=\"com.itykd.aspect.MyAspect\"/>
2.5 使用注解的AOP对目标类进行增强
- 在配置文件中打开注解的aop开发
<!-- 在配置文件中开启注解的AOP的开发 -->
<aop:aspectj-autoproxy />
- 这里以为OrderDao的save方法提供前置增强为例:在切面类上使用注解@Aspect,在方法前加入前置增强的注解@Before
package com.itykd.aspect;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class MyAspect {
@Before(value=\"execution(* com.itykd.dao.OrderDao.save(..))\")
public void before() {
System.out.println(\"前置增强===\");
}
}
2.6 编写测试类
spring整合Junit测试
package com.itykd.spring.aop;
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;
import com.itykd.dao.OrderDao;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(\"classpath:applicationContext.xml\")
public class SpringAOPDemo {
@Resource(name=\"orderDao\")
private OrderDao orderDao;
@Test
public void aopAnnotationDemo() {
orderDao.save();
orderDao.delete();
orderDao.update();
orderDao.find();
}
}
注解的通知类型和aop的切入点的配置见:https://blog.csdn.net/W2612888/article/details/85229101
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。



