pom.xml 坐标引入
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<dependencies>
<!-- 这里使用测试工具 版本要在4.12+ 低版本不够集合spring测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 使用Dbutils工具 对jdbc进行了一些封装 如 queryRunner -->
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.7</version>
</dependency>
<!-- mysql 驱动 ,没有这个 mysql数据库旧跑不起来 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- 使用阿里巴巴得druild 德鲁伊 连接池工具 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.14</version>
</dependency>
<!-- spring 核心坐标 核心框架 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- 基于子类得动态代理 CGlib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<!-- spring 面向切面 面向切面编程 AOP 得核心jar包 坐标 AOP是基于IOC得 IOC控制反转 -->
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.14</version>
</dependency>
<!-- spring 测试依赖 替换掉 junit 可以获得spring 容器得测试工具 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.2.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- 可以不用每次都获取spring容器 了
@RunWith(SpringJUnit4ClassRunner.class) //替换运行器,能够初始化spring容器
@ContextConfiguration("classpath:applicationContext.xml") //加载spring容器
public class demoTest {
@Autowired //自动注入实例
private UserService userService ;
@Test
public void test01(){
userService.Login();
}
}
-->
</dependencies>
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">
<!--配置spring 得通知 公共代码-->
<!-- 核心代码 目标 准备开始AOP 面向切面编程 -->
<bean id="target" class="com.itheima.springgao.demo01.UserServiceImpl"/>
<!-- Advice 通知类 公共代码 -->
<bean id="logger" class="com.itheima.springgao.demo01.Logger" />
<!-- spring 得 Aop 面向切面编程得配置 -->
<!-- 首先引入 新得命名空间 aop:config 此处编译器 会自动帮我们引入 aop:config 得命名空间 -->
<aop:config >
<!--我们得aop 得配置需要写在这里面 -->
<!-- 一,配置切入点(切入点为连接点中得一个 方法称之为连接点) 切入点表达式 spring厉害得地方
配置中 id 为自己起名 expression 中为表达式 可以使用通配符
expression =" execution( 返回值 路径.方法名())"-->
<aop:pointcut id="loginPt" expression="execution(void com.itheima.springgao.demo01.UserServiceImpl.Login())" />
<!-- 配置通知 (切面) 使用通知类得哪个方法 在切点得什么位置执行
id 为自己起名 ref指定advice 公用对象 (用得谁 ,来自哪里 使用id 获取)
-->
<aop:aspect id="loggerAdvice" ref="logger">
<!--在切入点 之前执行 before在目标类方法执行前切入 method 切入得方法名
poincur-ref 切入点是哪个 配置哪个对象为切入点 -->
<aop:before method="LoggerPrint" pointcut-ref="loginPt"/>
</aop:aspect>
</aop:config>
<!--
* 任意个 多个字符
. 一级包
.. 多级包 本级和子级包
任意返回值类型 com.itheima.springgao.demo01 包下得所有类 得所有方法 不记参数个数
<aop:pointcut id="loginPt" expression="execution(* com.itheima.springgao.demo01.*.*(..))" />
通知得4总类型
1.前置通知 方法前 before 放在切入点方法执行前 执行
<aop:before method="LoggerPrint" pointcut-ref="loginPt"/>
2.后置通知 方法后 afterRetuning 放在切入点方法执行后 执行
<aop:after-returning method="LoggerPrint" pointcut-ref="loginPt"/>
3.异常通知 类似catch中 afterThrowing 放在抓取异常代码中,异常产生了才会执行 与afterRetuning 互斥 (二者只能存在其一)
<aop:after-throwing method="LoggerPrint" pointcut-ref="loginPt"/>
4.最终通知 类似finally after 终会执行
<aop:after method="LoggerPrint" pointcut-ref="loginPt"/>
另类
环绕通知 : around spring 提供得一种自用控制通知代码得出现得编程方式
<aop:around method="around" pointcut-ref="loginPt"/>
-->
</beans>
环绕通知
//在切点类中书写
//ProceedingJoinPoint 当前正在执行得切入点对象 ,封装了目标对象得对应方法
public void around(ProceedingJoinPoint point) {
try{
System.out.println("前面");
point.proceed();//调用目标对象的原始方法
System.out.println("返回前");
}catch (Throwable e){ //这里 异常比较大 请使用Throwable
System.out.println("出错了");
}finally {
System.out.println("最终");
}
}