课时6::AOP、execution表达式、前置通知
.1)AOP:面向方面编程
1.aop的一些名词
.2)AOP的通知
1.一些通知的示意图
2.以前置通知为例子 其他的通知写法都差不多
2.1 导入相关jar包
<!-- https://mvnrepository.com/artifact/aopalliance/aopalliance --> <dependency> <groupId>aopalliance</groupId> <artifactId>aopalliance</artifactId> <version>1.0</version> </dependency> <!-- https://mvnrepository.com/artifact/aspectj/aspectjweaver --> <dependency> <groupId>aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.5.3</version> </dependency>
2.2 配置
2.2.0 编写ioc容器头部
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd"
2.2.1 注入业务类
<!-- 配置切入点的方法在哪个类-->
<bean id="studentService" class="net.bdqn.hbz.service.impl.IStudentServiceImpl">
<property name="iStudentDao" ref="studentDao"></property>
</bean>
2.2.2 注入通知类
<!-- 注入”前置通知“类--> <!-- 连接线的一方 切面--> <bean id="before" class="net.bdqn.hbz.aop.Before"/>
2.2.3 将addStudent 和 通知进行关联
<aop:config> <!-- 配置切入点 (在哪里执行通知) 连接线的另一方--> <aop:pointcut id="add" expression="execution(public void addStudent(net.bdqn.hbz.pojo.Student))"/> <!-- advisor相当于连接切入点和切面的线--> <aop:advisor advice-ref="before" pointcut-ref="add"/> </aop:config>
2.2.3.1 aop:config:将 将addStudent 和 通知进行关联
2.2.3.2 aop:pointcut :切入点的位置
id:切入点唯一标识符 expression:切入点的位置
2.2.3.3 aop:advisor:相当于连接切入点和切面的线
advice-ref:通知类(通知类注入的id) pointcut-ref:切入点的id
2.3 编写代码
2.3.1 aop:每当之前add()之前(IStudentService.java addStudent()) 自动执行一个方法
2.3.2 add():业务方法 log()l:自动执行的通知,即aop前置通知
2.3.3 编写前置通知的一个类实现MethodBeforeAdvice 将这个类变成前置通知类
package net.bdqn.hbz.aop; import org.springframework.aop.MethodBeforeAdvice; import java.lang.reflect.Method; /** * 前置通知类 */ public class Before implements MethodBeforeAdvice { @Override public void before(Method method, Object[] objects, Object o) throws Throwable { System.out.println("执行了前置通知"); } }
2.3.4 编写业务类
package net.bdqn.hbz.service.impl; import net.bdqn.hbz.dao.impl.IStudentDaoImpl; import net.bdqn.hbz.pojo.Student; import net.bdqn.hbz.service.IStudentService; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; public class IStudentServiceImpl implements IStudentService { private IStudentDaoImpl iStudentDao; public void setiStudentDao(IStudentDaoImpl iStudentDao) { this.iStudentDao = iStudentDao; } /** * * @param student */ @Transactional(readOnly = false,propagation = Propagation.REQUIRED) @Override public void addStudent(Student student) { iStudentDao.addStudent(new Student()); } }
3.如果想要添加多个切入点 通过execution来配置多个切入点
<aop:pointcut id="add"
expression="execution( public void deleteStudent(java.lang.Integer)) or execution(public void addStudent(net.bdqn.hbz.pojo.Student))"
/>
3.1 execution表达式的一些使用说明