【精选】黑马程序员 |
您所在的位置:网站首页 › springmvc的处理流程 › 【精选】黑马程序员 |
一、SpringMVC概述
SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于 SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 中。 SpringMVC 已经成为目前最主流的MVC框架之一,并且随着Spring3.0 的发布,全面超越 Struts2,成为最优 秀的 MVC 框架。它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时 它还支持 RESTful 编程风格的请求。 二、SpringMVC快速入门你 1)SpringMVC流程图示① 导入SpringMVC相关坐标 ② 配置SpringMVC核心控制器DispathcerServlet ③ 创建Controller类和视图页面 ④ 使用注解配置Controller类中业务方法的映射地址 ⑤ 配置SpringMVC核心文件 spring-mvc.xml ⑥ 客户端发起请求测试 ① 导入SpringMVC相关坐标 ① 导入Servlet和Jsp的坐标 org.springframework spring-context 5.0.5.RELEASE org.springframework spring-webmvc 5.0.5.RELEASE javax.servlet servlet-api 2.5 javax.servlet.jsp jsp-api 2.0② 在web.xml配置SpringMVC的核心控制器DispathcerServlet DispatcherServlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:spring-mvc.xml 1 DispatcherServlet /③ 创建Controller类和视图页面 public class QuickController { public String quickMethod(){ System.out.println("quickMethod running....."); return "index.jsp"; } }④ 使用注解配置Controller类中业务方法的映射地址 @Controller public class QuickController { @RequestMapping("/quick") public String quickMethod(){ System.out.println("quickMethod running....."); return "index.jsp"; } }⑤ 配置SpringMVC核心文件 spring-mvc.xml 三、SpringMVC组件解析 1)SpringMVC的执行流程① 用户发送请求至前端控制器DispatcherServlet。 ② DispatcherServlet收到请求调用HandlerMapping处理器映射器。 ③ 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果 有则生成)一并返回给DispatcherServlet。 ④ DispatcherServlet调用HandlerAdapter处理器适配器。 ⑤ HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。 ⑥ Controller执行完成返回ModelAndView。 ⑦ HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。 ⑧ DispatcherServlet将ModelAndView传给ViewReslover视图解析器。 ⑨ ViewReslover解析后返回具体View。 ⑩ DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。DispatcherServlet响应用户。 2)SpringMVC组件解析1. 前端控制器:DispatcherServlet 用户请求到达前端控制器,它就相当于 MVC 模式中的 C,DispatcherServlet 是整个流程控制的中心,由 它调用其它组件处理用户的请求,DispatcherServlet 的存在降低了组件之间的耦合性。 2. 处理器映射器:HandlerMapping HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的 映射方式,例如:配置文件方式,实现接口方式,注解方式等。 3. 处理器适配器:HandlerAdapter 通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理 器进行执行。 4. 处理器:Handler 它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由 Handler 对具体的用户请求进行处理。 5. 视图解析器:View Resolver View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名,即 具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。 6. 视图:View SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView等。最 常用的视图就是 jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程 序员根据业务需求开发具体的页面 3)SpringMVC注解解析@RequestMapping 作用:用于建立请求 URL 和处理请求方法之间的对应关系 位置: 类上,请求URL 的第一级访问目录。此处不写的话,就相当于应用的根目录方法上,请求 URL 的第二级访问目录,与类上的使用@ReqquestMapping标注的一级目录一起组成访问虚拟路径属性: value:用于指定请求的URL。它和path属性的作用是一样的method:用于指定请求的方式params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样例如 ①params = {"accountName"},表示请求参数必须有accountName ②params = {"moeny!100"},表示请求参数中money不能是100 4)SpringMVC的XML配置解析 ①视图解析器REDIRECT_URL_PREFIX = "redirect:" --重定向前缀 FORWARD_URL_PREFIX = "forward:" --转发前缀(默认值) prefix = " "; --视图名称前缀 suffix = " "; --视图名称后缀 我们可以通过属性注入的方式修改视图的的前后缀 四、SpringMVC的数据响应写配置时一定要先加上mvc的注解驱动 在方法上添加@ResponseBody就可以返回json格式的字符串。 我们可以使用mvc的注解驱动代替配置,让SpringMVC自动将User转换成json格式的字符串。 1)SpringMVC的数据响应方式1、页面跳转 ①直接返回字符串 ② 通过ModelAndView对象返回 2、回写数据 ① 直接返回字符串 ② 返回对象或集合 2)页面跳转 ①ModelAndView对象它可以通过ModelAndView的addObject()方法设置,向request域存储数据。也可以进行页面跳转。 @RequestMapping(value="/quick3") //如果传有ModelAndView作为形参,MVC框架会帮你注入,那么MVC会将自动给你创建一个ModelAndView对象供你使用 public ModelAndView save3(ModelAndView modelAndView){ modelAndView.addObject("username","itheima"); modelAndView.setViewName("success"); return modelAndView; } ②返回字符串形式直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转。 返回对象或集合,或者字符串 在方法上添加@ResponseBody就可以返回json格式的字符串。 因此,我们可以使用mvc的注解驱动代替配置,让SpringMVC自动将User转换成json格式的字符串。 在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。 使用自动加载 RequestMappingHandlerMapping(处理映射器)和 RequestMappingHandlerAdapter( 处 理 适 配 器 ),可用在Spring-xml.xml配置文件中使用 替代注解处理器和适配器的配置。 同时使用默认底层就会集成jackson进行对象或集合的json格式字符串的转换。 @RequestMapping("/quick7") @ResponseBody //告知SpringMVC框架 不进行视图跳转 直接进行数据响应 public String quickMethod7() throws IOException { User user = new User(); user.setUsername("zhangsan"); user.setAge(18); return user; } 五、SpringMVC获得请求数据MVC实现数据请求方式 基本类型参数POJO类型参数数组类型参数 集合类型参数MVC获取数据细节 中文乱码问题@RequestParam 和 @PathVariable自定义类型转换器获得Servlet相关API@RequestHeader 和 @CookieValue文件上传 1)基本类型参数,POJO类型参数和数组类型参数的获取Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配。 //数组数据类型的获取 @RequestMapping("/quick11") @ResponseBody public void quickMethod11(String[] strs) throws IOException { System.out.println(Arrays.asList(strs)); } //POJO数据类型的获取 public class User { private String username; private int age; getter/setter… } @RequestMapping("/quick10") @ResponseBody public void quickMethod10(User user) throws IOException { System.out.println(user); } //基本数据类型的获取 @RequestMapping("/quick9") @ResponseBody public void quickMethod9(String username,int age) throws IOException { System.out.println(username); System.out.println(age); } 2)获得集合类型参数一般情况:获得集合参数时,要将集合参数包装到一个POJO中才可以。 //用户类 public class User { private String username; private int age; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User{" + "username='" + username + '\'' + ", age=" + age + '}'; } } //用于封装的类 public class VO { private List userList; public List getUserList() { return userList; } public void setUserList(List userList) { this.userList = userList; } @Override public String toString() { return "VO{" + "userList=" + userList + '}'; } } //测试程序 @RequestMapping("/quick12") @ResponseBody public void quickMethod12(Vo vo) throws IOException { System.out.println(vo.getUserList()); }特殊情况: 当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以 直接接收集合数据而无需使用POJO进行包装。 //模拟数据 var userList = new Array(); userList.push({username: "zhangsan",age: "20"}); userList.push({username: "lisi",age: "20"}); $.ajax({ type: "POST", url: "/itheima_springmvc1/quick13", data: JSON.stringify(userList), contentType : 'application/json;charset=utf-8' }); @RequestMapping("/quick13") @ResponseBody public void quickMethod13(@RequestBody List userList) throws IOException { System.out.println(userList); } 3)设置开放静态资源通过谷歌开发者工具抓包发现,没有加载到jquery文件,原因是SpringMVC的前端控制器 DispatcherServlet的url-pattern配置的是/,代表对所有的资源都进行过滤操作, 我们可以通过以下两种方式指定放行静态资源: • 在spring-mvc.xml配置文件中指定放行的资源 • 使用标签 4)请求数据乱码问题当post请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码的过滤。 CharacterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 CharacterEncodingFilter /* 5)参数绑定注解@requestParam 注解@RequestParam还有如下参数可以使用: value:与请求参数名称required:此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错defaultValue:当没有指定请求参数时,则使用指定的默认值赋值其实就是设置个别名,来获取表单中的数据 @RequestMapping("/quick14") @ResponseBody public void quickMethod14(@RequestParam("name") String username) throws IOException { System.out.println(username); } 6)获得Restful风格的参数Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。主要用于客户端和服务 器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存机制等。 Restful风格的请求是使用“url+请求方式”表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下: GET:用于获取资源 POST:用于新建资源 PUT:用于更新资源 DELETE:用于删除资源例如: /user/1 GET : 得到 id = 1 的 user/user/1 DELETE: 删除 id = 1 的 user /user/1 PUT: 更新 id = 1 的 user/user POST: 新增 user上述url地址/user/1中的1就是要获得的请求参数,在SpringMVC中可以使用占位符进行参数绑定。 地址/user/1可以写成 /user/{id},占位符{id}对应的就是1的值。在业务方法中我们可以使用@PathVariable注解进行占位符的匹配获取工作。 自定义类型转换器的开发步骤: ① 定义转换器类实现Converter接口 ② 在配置文件中声明转换器 ③ 在中引用转换器 ① 定义转换器类实现Converter接口 //第一个参数是接受的参数类型,第二个参数是要转换成的类型 public class DateConverter implements Converter { public Date convert(String dateStr) { //将日期字符串转换成日期对象 返回 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Date date = null; try { date = format.parse(dateStr); } catch (ParseException e) { e.printStackTrace(); } return date; } }② 在配置文件中声明转换器 ③ 在中引用转换器 8)获得Servlet相关APISpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入,常用的对象如下: HttpServletRequestHttpServletResponseHttpSession @RequestMapping("/quick16") @ResponseBody public void quickMethod16(HttpServletRequest request,HttpServletResponse response, HttpSession session){ System.out.println(request); System.out.println(response); System.out.println(session); } 9)获得请求头 ① @RequestHeader使用@RequestHeader可以获得请求头信息,相当于web阶段学习的request.getHeader(name) @RequestHeader注解的属性如下: value:请求头的名称required:是否必须携带此请求头 @RequestMapping("/quick17") @ResponseBody public void quickMethod17(@RequestHeader(value = "User-Agent",required = false) String headerValue){ System.out.println(headerValue); } ② @CookieValue使用@CookieValue可以获得指定Cookie的值 @CookieValue注解的属性如下: value:指定cookie的名称required:是否必须携带此cookie @RequestMapping("/quick18") @ResponseBody public void quickMethod18(@CookieValue(value = "JSESSIONID",required = false) String jsessionid){ System.out.println(jsessionid); } 10)文件上传 ①文件上传客户端三要素 表单项type=“file”表单的提交方式是post表单的enctype属性是多部分表单形式,及enctype=“multipart/form-data” 名称: 文件: ② 文件上传原理 当form表单修改为多部分表单时,request.getParameter()将失效。enctype=“application/x-www-form-urlencoded”时,form表单的正文内容格式是: key=value&key=value&key=value当form表单的enctype取值为Mutilpart/form-data时,请求正文内容就变成多部分形式:① 导入fileupload和io坐标 ② 配置文件上传解析器 ③ 编写文件上传代码 ① 导入fileupload和io坐标 commons-fileupload commons-fileupload 1.2.2 commons-io commons-io 2.4② 配置文件上传解析器 ③ 编写文件上传代码 @RequestMapping("/quick20") @ResponseBody public void quickMethod20(String name,MultipartFile uploadFile) throws IOException { //获得文件名称 String originalFilename = uploadFile.getOriginalFilename(); //保存文件 uploadFile.transferTo(new File("C:\\upload\\"+originalFilename)); } ④多文件上传实现多文件上传,只需要将页面修改为多个文件上传项,将方法参数MultipartFile类型修改为MultipartFile[]即可,然后用for循环对每个文件文件进行获取和保存。 多文件上传测试 名称: 文件1: 文件2: 文件3: @RequestMapping("/quick21") @ResponseBody public void quickMethod21(String name,MultipartFile[] uploadFiles) throws IOException { for (MultipartFile uploadFile : uploadFiles){ String originalFilename = uploadFile.getOriginalFilename(); uploadFile.transferTo(new File("C:\\upload\\"+originalFilename)); } } 六、Spring JdbcTemplate基本使用 1)概述它是spring框架中提供的一个对象,是对原始繁琐的Jdbc API对象的简单封装。spring框架为我们提供了很多的操作 模板类。例如:操作关系型数据的JdbcTemplate和HibernateTemplate,操作nosql数据库的RedisTemplate,操 作消息队列的JmsTemplate等等。 2)JdbcTemplate开发步骤① 导入spring-jdbc和spring-tx坐标 ② 创建数据库表和实体 ③ 创建JdbcTemplate对象 ④ 执行数据库操作 ① 导入spring-jdbc和spring-tx坐标 org.springframework spring-jdbc 5.0.5.RELEASE org.springframework spring-tx 5.0.5.RELEASE②创建数据库表和实体 ③ 创建JdbcTemplate对象 我们可以将JdbcTemplate的创建权交给Spring,将数据源DataSource的创建权也交给Spring,在Spring容器内部将 数据源DataSource注入到JdbcTemplate模版对象中,配置如下: ④ 执行数据库操作 @ContextConfiguration这个注解通常与@RunWith(SpringJUnit4ClassRunner.class)联合使用用来测试当一个类添加了注解@Component,那么他就自动变成了一个bean,就不需要再Spring配置文件中显示的配置了。把这些 bean收集起来通常有两种方式,Java的方式和XML的方式。当这些bean收集起来之后,当我们想要在某个测试类使用@Autowired注解来引入这些收集起来的bean时,只需要给这个测试类添加@ContextConfiguration注解来标注我们想要导入这个测试类的某些bean。 常用操作: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class JdbcTemplateCRUDTest { @Autowired private JdbcTemplate jdbcTemplate; //查询一条记录 @Test public void testQueryOne() { Long count = jdbcTemplate.queryForObject() } //查询所有记录 @Test public void testQueryAll() { List userList = jdbcTemplate.query("select * from user_table", new BeanPropertyRowMapper(user.class)); System.out.println(userList); } //更新数据操作 @Test public void testUpdate() { jdbcTemplate.update("update user_table set password=? where user=?", "qq1111111", "DD"); } //删除操作 @Test public void testDelete() { jdbcTemplate.update("delete from user_table where user=?", "qq"); } } @Test public void test2(){ ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); JdbcTemplate jdbcTemplate=app.getBean(JdbcTemplate.class); int row = jdbcTemplate.update("insert into user_table value (?,?,?)","qq","123456",1252); System.out.println(row); } 七、SpringMVC拦截器(interceptor) 1)拦截器(interceptor)的作用Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。 将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(Interceptor Chain)。在访问被拦截的方 法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现。 2)拦截器方法说明3)自定义拦截器的开发步骤 ① 创建拦截器类实现HandlerInterceptor接口 ② 配置拦截器 ③ 测试拦截器的拦截效果 ① 创建拦截器类实现HandlerInterceptor接口 import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class MyInterceptor1 implements HandlerInterceptor { //在目标方法执行之前 执行 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException { //设置需要的程序 } //在目标方法执行之后 视图对象返回之前执行 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { //设置需要的程序 } //在流程都执行完毕后 执行 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { //设置需要的程序 } }② 配置拦截器 八、SpringMVC异常处理 1)异常处理的思路 系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后 者主要通过规范代码开发、测试等手段减少运行时异常的发生。 系统的Dao、Service、Controller出现都通过throws Exception向上抛出,最后由SpringMVC前端控制器交 由异常处理器进行异常处理,如下图: 2)异常处理两种方式 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器 3)简单异常处理器SimpleMappingExceptionResolver SpringMVC已经定义好了该类型转换器,在使用时可以根据项目情况进行相应异常与视图的映射配置
① 创建异常处理器类实现HandlerExceptionResolver ② 配置异常处理器 ③ 编写异常页面 ④ 测试异常跳转 ① 创建异常处理器类实现HandlerExceptionResolver public class MyExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { //处理异常的代码实现 //创建ModelAndView对象 ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("exceptionPage"); return modelAndView; } }② 配置异常处理器 ③ 编写异常页面 Title 这是一个最终异常的显示页面④ 测试异常跳转 @RequestMapping("/quick22") @ResponseBody public void quickMethod22() throws IOException, ParseException { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); simpleDateFormat.parse("abcde"); } 九、Spring 的 AOP 1)什么是 AOP及其作用和优势AOP 为 Aspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代理 实现程序功能的统一维护的一种技术。 AOP 是 OOP(面向对象) 的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍 生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序 的可重用性,同时提高了开发的效率。 作用:在程序运行期间,在不修改源码的情况下对方法进行功能增强 优势:减少重复代码,提高开发效率,并且便于维护 2)AOP 的底层实现实际上,AOP 的底层是通过 Spring 提供的的动态代理技术实现的。在运行期间,Spring通过动态代理技术动态 的生成代理对象,代理对象方法执行时进行增强功能的介入,在去调用目标对象的方法,从而完成功能的增强 3) AOP 的动态代理技术常用的动态代理技术 JDK 代理 : 基于接口的动态代理技术cglib 代理:基于父类的动态代理技术
Spring 的 AOP 实现底层就是对上面的动态代理的代码进行了封装,封装后我们只需要对需要关注的部分进行代码编 写,并通过配置的方式完成指定目标的方法增强。 在正式讲解 AOP 的操作之前,我们必须理解 AOP 的相关术语,常用的术语如下: Target(目标对象):代理的目标对象(被增强的对象)Proxy (代理):一个类被 AOP 织入增强后,就产生一个结果代理类Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点(可以被增强的方法)Pointcut(切入点):所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义(真正配置去增强的方法,范围比连接点小)Advice(通知/ 增强):所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知(封装增强业务逻辑的方法)Aspect(切面):是切入点和通知(引介)的结合(切点+增强(通知))Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程。spring采用动态代理织入,而 AspectJ采用编译期织入和类装载期织入(增强和切点结合的过程叫做织入,通过配置实现) 5)AOP 开发明确的事项1. 需要编写的内容 编写核心业务代码(目标类的目标方法)编写切面类,切面类中有通知(增强功能方法)在配置文件中,配置织入关系,即将哪些通知与哪些连接点进行结合2. AOP 技术实现的内容 Spring 框架监控切入点方法的执行。一旦监控到切入点方法被运行,使用代理机制,动态创建目标对象的 代理对象,根据通知类别,在代理对象的对应位置,将通知对应的功能织入,完成完整的代码逻辑运行。 3. AOP 底层使用哪种代理方式 在 spring 中,框架会根据目标类是否实现了接口来决定采用哪种动态代理的方式。 6) 基于 XML 的 AOP 开发快速入门 1.开发步骤① 导入 AOP 相关坐标 ② 创建目标接口和目标类(内部有切点) ③ 创建切面类(内部有增强方法) ④ 将目标类和切面类的对象创建权交给 spring ⑤ 在 applicationContext.xml 中配置织入关系 ⑥ 测试代码 ① 导入 AOP 相关坐标 org.springframework spring-context 5.0.5.RELEASE org.aspectj aspectjweaver 1.8.13
② 创建目标接口和目标类(内部有切点) //接口类 public interface TargetInterface { public void save(); } //实现类(目标类) public class Target implements TargetInterface { public void save() { System.out.println("save running....."); } }③ 创建切面类(内部有增强方法) public class MyAspect { //前置增强方法 public void before(){ System.out.println("前置代码增强....."); } }④ 将目标类和切面类的对象创建权交给 spring ⑤ 在 applicationContext.xml 中配置织入关系 1.导入aop命名空间 2. 配置切点表达式和前置增强的织入关系 7)XML 配置 AOP 详解 ① 切点表达式的写法
表达式语法: execution([修饰符] 返回值类型 包名.类名.方法名(参数)) 访问修饰符可以省略返回值类型、包名、类名、方法名可以使用星号* 代表任意包名与类名之间一个点 . 代表当前包下的类,两个点 .. 表示当前包及其子包下的类参数列表可以使用两个点 .. 表示任意个数,任意类型的参数列表例如: execution(public void com.itheima.aop.Targethod()) com包下的itheima包下的aop包下的Target类下的method方法(无参)并且无返回值 execution(void com.itheima.aop.Target.*(..)) com包下的itheima包下的aop包下的Target类下的任意方法并且是任意参数(有参无参都可)并且无返回值 execution(* com.itheima.aop.*.*(..)) com包下的itheima包下的aop包下的任意类的任意方法并且是任意参数(有参无参都可)并且是什么返回值都可以 execution(* com.itheima.aop..*.*(..)) com包下的itheima包下的aop包及其子包下的任意类的任意方法并且是任意参数(有参无参都可)并且是什么返回值都可以 execution(* *..*.*(..)) 任意包的任意类的任意方法 ②通知的类型 通知的配置语法: |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |