一-Spring基础(2)-AOP-【JavaEE开发的颠覆者】
程序员文章站
2022-05-24 11:29:13
...
一、AOP
面向切面编程
Spring的AOP的存在的目的是为了解耦。AOP可以让一组类共享相同的行为。在OOP中只能通过继承类和实现接口,来使代码的耦合度增强,且类继承只能为单继承,阻碍更多行为添加到一组类上,AOP弥补了OOP的不足。
二、Spring支持AspectJ的注解式切面编程
1.使用@Aspect声明是一个切面
2.使用@After、@Before、@Around定义建言(advice),可直接将拦截规则(切点)作为参数。
3.其中@After、@Before、@Around参数的拦截规则为切点(PointCut),为了使节点复用,可使用@PointCut专门定义拦截规则,然后在@After、@Before、@Around的参数中调用。
4.其中符合条件的每一个被拦截处为拦截点(JoinPoint)。
三、示例
1.添加依赖
<!--spring aop支持-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<!--aspectj支持-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.5</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.5</version>
</dependency>
2.编写拦截规则的注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Action {
String name();
}
3.编写使用注解的被拦截的类
//使用注解的被拦截类
@Service
public class SpringAopAnnotationService {
@Action(name = "注解式被拦截的add操作")
public void add(){
System.out.println("注解式Service中的add操作正在执行");
}
}
4.编写使用方法规则的被拦截的类
//使用方法规则被拦截类
@Service
public class SpringAopMethodService {
public void add(){
System.out.println("方法式Service中的add操作正在执行");
}
}
5.编写切面
//编写切面
@Aspect
@Component
public class LogAspect {
@Pointcut("@annotation(zhao.spring.com.SpringAOP.Action)")
public void annotationPointCut(){};
@After("annotationPointCut()")
public void after(JoinPoint joinPoint){
MethodSignature signature=(MethodSignature)joinPoint.getSignature();
Method method=signature.getMethod();
Action action=method.getAnnotation(Action.class);
System.out.println("注解式拦截"+action.name());
}
@Before("execution(* zhao.spring.com.SpringAOP.SpringAopAnnotationService.*(..))")
public void before(JoinPoint joinPoint){
MethodSignature signature=(MethodSignature)joinPoint.getSignature();
Method method=signature.getMethod();
System.out.println("方法规则拦截"+method.getName());
}
}
/**
* 通过@Aspect注解声明一个切面
* 通过@Component让此切面成为Spring容器管理的Bean
* 通过@PointCut注解声明切点
* 通过@After注解声明一个建言,并使用@PointCut定义的切点
*/
6.配置类
//配置类
@Configuration
@ComponentScan("zhao.spring.com.SpringAOP")
@EnableAspectJAutoProxy
public class AopConfig {
}
/**
* 使用@EnableAspectJAutoProxy注解开启Spring对AspectJ代理的支持
*/
7.启动类
//启动类
public class SpringAopMain {
public static void main(String[] args) {
AnnotationConfigApplicationContext context=
new AnnotationConfigApplicationContext(AopConfig.class);
//注解拦截
SpringAopAnnotationService springAopService=context.getBean(SpringAopAnnotationService.class);
springAopService.add();
//方法拦截
SpringAopMethodService springAopMethodService=context.getBean(SpringAopMethodService.class);
springAopMethodService.add();
context.close();
}
}
推荐阅读
-
Web开发:Struts2 Spring Hibernate整合(一)——Struts2的使用
-
Web开发:Struts2 Spring Hibernate整合(一)——Struts2的使用
-
那些在《JavaEE开发的颠覆者 Spring Boot实战》中遇到的坑,,。(二)
-
一-Spring基础(2)-AOP-【JavaEE开发的颠覆者】
-
《JavaEE开发的颠覆者: Spring Boot实战》资源及勘误
-
JavaEE开发的颠覆者:Spring Boot实战 学习笔记1--Maven
-
一种Java Web应用开发框架的构建(基于Struts2+Spring+FreeMarker)之一
-
开发颠覆者SpringBoot实战---------Spring的基础学习
-
《JavaEE开发的颠覆者: Spring Boot实战》资源及勘误
-
《JavaEE开发的颠覆者: Spring Boot实战》资源及勘误