1.导入所需架包
com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
commons-logging-1.2.jar
spring-aop-5.2.6.RELEASE.jar
spring-aspects-5.2.6.RELEASE.jar
spring-beans-5.2.6.RELEASE.jar
spring-context-5.2.6.RELEASE.jar
spring-core-5.2.6.RELEASE.jar
spring-expression-5.2.6.RELEASE.jar
下载地址:链接: https://pan.baidu.com/s/1LoZ3qtkcQDgr6ffW1HkwcQ 提取码: mukz 复制这段内容后打开百度网盘手机App,操作更方便哦
概念:1.切入点表达式
(1)切入点表达式作用:直到对哪个类里面的那个方法进行增强。
(2)语法结构:execution([权限修饰符] [返回值类型] [类全路径]([参数列表]))
举例1:对com.zhulei.dao.BookDao类中的add方法进行增强
execution(* com.zhulei.dao.BookDao.add(..))
举例2:对com.zhulei.dao.BookDao类中所有方法进行增强
execution(* com.zhulei.dao.BookDao.*(..))
举例3:对com.zhulei.dao包中所有类所有方法进行增强
execution(* com.zhulei.dao.*.*(..))
2.创建一个被增强的类
//被增强类
import org.springframework.stereotype.Component;
@Component
public class User {
public void add(){
System.out.println("add...");
}
}
3.创建一个增强类
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
//增强类
@Component
@Aspect//生成代理对象
public class UserProxy {
//前置通知
@Before(value = "execution(* zhulei.spring5.aopanno.User.add(..))")
public void before(){
System.out.println("before...");
}
@After(value = "execution(* zhulei.spring5.aopanno.User.add(..))")
public void after(){
System.out.println("after...");
}
//返回值之后执行
@AfterReturning(value = "execution(* zhulei.spring5.aopanno.User.add(..))")
public void AfterReturning(){
System.out.println("AfterReturning...");
}
//异常通知
@AfterThrowing(value = "execution(* zhulei.spring5.aopanno.User.add(..))")
public void AfterThrowing(){
System.out.println("AfterThrowing...");
}
@Around(value = "execution(* zhulei.spring5.aopanno.User.add(..))")
public void Around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("Around...");
proceedingJoinPoint.proceed();
System.out.println("arond之后。。。");
}
}
4.创建配置文件扫描注解,开启生成代理对象
<?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:context="http://www.springframework.org/schema/context"
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/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--开启组件扫描
如果有多个包,多个包可使用逗号隔开 或写包上层目录-->
<!--<context:component-scan base-package="zhulei.spring5.dao,zhulei.spring5.service,zhulei.spring5.testdemo"></context:component-scan>-->
<context:component-scan base-package="zhulei.spring5"></context:component-scan>
<!--
use-default-filters="false"表示现在不使用默认filter,自己配置filter
context:include-filter,设置扫描哪些内容
-->
<!-- <context:component-scan base-package="zhulei.spring5" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>-->
<!--
context:exclude-filter,设置不扫描哪些内容
-->
<!-- <context:component-scan base-package="zhulei.spring5">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>-->
<!--开启AspectJ生成代理对象-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
5.创建测试类
public class TestSpringDemo1 {
@Test
public void testService(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
UserService userService = context.getBean("userService",UserService.class);
userService.add();
}
@Test
public void testService2(){
//加载配置类
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = context.getBean("userService",UserService.class);
userService.add();
}
}