spring总结————AOP面向切面总结

spring总结————AOP面向切面java

 

1、spring aop概念

spring aop面向切面编程,java是面向对象的语言。面试

真正的service层代码spring

业务逻辑层再处理业务以前和以后都要进行一些参数的校验,异常处理,日志记录等代码。有很是多很是核心的业务逻辑在里面,这些业务逻辑不要是不行的。怎么解决这种问题?生活中有不少这样的例子,实际上就是使用了代理模式来解决这个问题。spring aop 就是基于代理模式的。代理分静态代理和动态代理,spring aop的核心就是经过动态代理来实现的。express

2、使用bean的方式配置spring的aop

先建立项目,把项目运行起来

第一步,建立spring项目  引入jar包编程

第二步,建立主配置文件设计模式

1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xsi:schemaLocation="http://www.springframework.org/schema/beans
6 http://www.springframework.org/schema/beans/spring-beans.xsd
7 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring context.xsd">
8 <bean id="userService" class="com.aaa.spring.service.impl.UserServiceImpl"></bean>
9 </beans>

第三步,建立包实体类app

注:service层只保留核心的业务逻辑代码:ide

 

 1 package com.aaa.spring.service.impl;  2 import com.aaa.spring.entity.Userimport com.aaa.spring.service.UserService/**
 3 * 用户管理service实现类  4 */
 5 public class UserServiceImpl implements UserService {  6 @Override  7 public void saveUser(User user) {  8 System.out.println("保存用户");  9 } 10 @Override 11 public void deleteUser(User user) { 12 System.out.println("删除用户"); 13 } 14 @Overridepublic void updateUser(User user) { 15 System.out.println("修改用户"); 16 } 17 @Override 18 public User findById(Long id) { 19 System.out.println("根据id查找用户"); 20 return null; 21 } 22 }

第四步,在spring的主配置文件中配置bean测试

1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xsi:schemaLocation="http://www.springframework.org/schema/beans
6 http://www.springframework.org/schema/beans/spring-beans.xsd
7 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring context.xsd">
8 <bean id="userService" class="com.aaa.spring.service.impl.UserServiceImpl"></bean>
9 </beans>

 第五步,测试spa

 1 package com.aaa.spring;  2 import com.aaa.spring.entity.User;  3 import com.aaa.spring.service.UserService;  4 import javafx.application.Application;  5 import org.springframework.context.ApplicationContext;  6 import org.springframework.context.support.ClassPathXmlApplicationContext;  7 /**
 8 * 获取对象  9 */
10 public class Test01 { 11 public static void main(String[] args) { 12 //建立spring的工厂类对象
13 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 14 //从工厂中获取对象
15 UserService userService = context.getBean(UserService.class); 16 userService.saveUser(new User()); 17 userService.deleteUser(new User()); 18 userService.updateUser(new User()); 19 userService.findById(10L); 20 } 21 }

 

 3、实现aop

1、导入jar包

2、声明日志处理类的代码 ,在spring aop中,管这种代码叫通知 

 1 package com.aaa.spring.advice;  2 import org.aspectj.lang.JoinPoint;  3 import java.util.Date;  4 /**
 5 * 日志记录的代码  6 */
 7 public class LogAdvice {  8 /**
 9 * 日志记录的代码,经过JoinPoint对象能够获取方法调用的一些参数 10 * @param jp 11 */
12 public void log(JoinPoint jp){ 13 //获取调用方法的名称
14 String methodName = jp.getSignature().getName(); 15 System.out.println(new Date()+"调用了"+methodName); 16 } 17 }

3、配置AOP

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4 xmlns:context="http://www.springframework.org/schema/context"
 5 xmlns:aop="http://www.springframework.org/schema/aop"
 6 xsi:schemaLocation="http://www.springframework.org/schema/beans
 7 http://www.springframework.org/schema/beans/spring-beans.xsd
 8 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">
 9 <bean id="userService" class="com.aaa.spring.service.impl.UserServiceImpl"></bean>
10 <!--声明通知类的对象,盖了一个传达室-->
11 <bean id="logAdvice" class="com.aaa.spring.advice.LogAdvice"></bean>
12 <!--
13 实现aop 至关于实如今有同窗进入学校的时候检查是否穿了拖鞋 14 -->
15 <aop:config>
16 <!---声明切入点表达式 expression是什么要拦截哪些类的哪些方法 17 切入点表达式语法 18 举例1:若是要拦截全部com.aaa.spring.service.impl包下的UserServiceImpl类的全部以User结尾的方法 19 execution(* com.aaa.spring.service.imp.UserServiceImpl.*User(..)) 20 举例2:若是要拦截全部类的以User结尾的方法 21 execution(* *User(..)) 22 举例2:要拦截全部com.aaa.spring包或者子包下全部的以User结尾的方法 23 execution(* com.aaa.spring..*.*User(..)) 24 -->
25 <aop:pointcut id="p1" expression="execution(void *User(..)) "></aop:pointcut>
26 <!---声明切面,完成日志记录的功能-->
27 <aop:aspect ref="logAdvice">
28 <!--声明后置通知,在全部拦截的方法执行完以后执行-->
29 <!---拦截到目标方法以后要调用通知类的哪一个方法-->
30 <aop:after-returning method="log" pointcut-ref="p1"></aop:after-returning>
31 </aop:aspect>
32 </aop:config>
33 </beans>

bean配置aop

4、测试

4、aop经常使用的五种通知类型

通知类型  

说明  

注解配置(aop:aspectj-autoproxy)

aop:before前置通知  

在目标方法调用以前执行

@Before("exception(void *(..))")

aop:after-returning后置通知

在目标方法调用以后执行,一旦目标方法产生异常,不会执行

@AfterReturning("execution(*(..))")

aop:after最终通知

在目标方法调用以后执行,不管目标是否产生异常,都会被执行

 

aop:after-throwing异常通知

在目标方法产生异常的时候执行

@AfterThrowing(pointcut="excution(void *(..))",throwing="e")

aop:arround 环绕通知

在目标方法执行以前和 以后都写一写非核心的业务逻辑,通常能够用来替代前置通知和后置通知

aop:around,method,pointcut-ref

总结:aop面向切面编程,aop接口业务逻辑中横向代码重复的问题

aop用bean的方式配置aop通知五种类型

使用注解配置aop

面试题:

aop底层使用了什么设计模式

使用了动态代理模式 springaop支持jdk动态代理和cglib动态代理

spring aop经常使用的五种通知类型是什么

前置通知,后置通知,环绕通知,异常通知,最终通知

相关文章
相关标签/搜索