maven仓库导入必要jar包:
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.1.14.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.8</version>
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.3</version>
<scope>runtime</scope>
</dependency>
1.创建原始对象:
/*
原始类
*/
public class UserServiceImpl implements UserService{
public void register(User user) {
System.out.println("业务运算+DAO调用");
}
public void login(String name, String password) {
System.out.println("UserServiceImpl.login");
}
}
2.额外功能:MethodBeforAdvice接口
1.额外功能书写在接口实现中,运行在原始方法执行之前。
public class Before implements MethodBeforeAdvice {
/*
书写额外功能
*/
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println("---method before advice log---");
}
}
Spring配置文件:
<bean id="before" class="com.bao.spring.dynamic.Before"></bean>
3.定义切入点:额外功能加入的位置
目的:自由指定原始方法加入额外功能
配置文件:
<aop:config>
<!-- pointcut:切入点-->
<!-- expression="execution(* *(..)):原始类所有方法加额外方法-->
<aop:pointcut id="pc" expression="execution(* *(..))"/>
</aop:config>
4.组装:切入点与额外功能整合
<aop:config>
<!-- pointcut:切入点-->
<!-- expression="execution(* *(..)):原始类所有方法加额外方法-->
<aop:pointcut id="pc" expression="execution(* *(..))"/>
<!-- 组装,所有的原始方法都加入额外方法-->
<aop:advisor advice-ref="before" pointcut-ref="pc"></aop:advisor>
</aop:config>
5.调用:获得Spring工厂创建的动态代理对象
注意:
1.Spring的工厂通过原始对象的id值获得的是代理对象(原始类配置文件id:userService)
2.获得代理对象后,可以通过声明接口类型,进行对象存储(动态代理类与原始类实现的共同UserService接口)
@Test
public void text2(){
ApplicationContext app = new ClassPathXmlApplicationContext("springmvc4.xml");
UserService userService = (UserService) app.getBean("userService");
userService.login("陈宝","2816");
}
动态代理类:Spring框架运行时,通过动态字节码技术,在JVM创建时运行在JVM内部,程序结束时和JVM一起消失。
动态字节码技术:
动态代理不需要定义类文件,都是通过JVM运行过程中创建的,不会造成静态代理中类文件过多影响项目管理的问题。
简化代理开发,在额外功能不改变的前提下,创建其他原始类代理对象时,只需配置文件指定原始对象。
额外功能的维护性增强。