spring自定义注解

Spring AOP

天大地大妈咪最大 提交于 2020-03-08 10:36:49
AOP AOP(Aspect Oriented Programming 面向切面编程)是一种通过运行期动态代理实现代码复用的机制,是对传统OOP(Object Oriented Programming,面向对象编程 )的补充。 AOP的作用 在OOP中,正是这种分散在各处且与对象核心功能无关的代码(横切代码)的存在,使得模块复用难度增加。AOP则将封装好的对象剖开,找出其中对多个对象产生影响的公共行为,并将其封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),切面将那些与业务无关,却被业务模块共同调用的逻辑提取并封装起来, 减少了系统中的重复代码 , 降低了模块间的耦合度 , 同时提高了系统的可维护性 。 实现AOP 1、添加jar类库 2、Spring配置文件添加< aop:aspectj-autoproxy/>,该配置作用:如果创建目标对象的目标类中的方法与AspectJ切面中切入点表达式匹配,则自动为该目标对象生成动态代理对象, 3、自定义一个@Aspect修饰的切面类——>将其创建的对象保存于Spring IOC容器——>自定义增强方法,增强方法也称为通知方法,指有@Before、@AfterRunning、@AfterThrowing、@After或@Around注解修饰的Java方法。 代码如下: package com.jd.aop ; import

Spring Boot 全局数据绑定

我的梦境 提交于 2020-03-08 02:53:23
在上一篇全局异常处理 Spring Boot 统一异常处理 中我们用到@RestControllerAdvice注解,该注解是对Controller进行增强的,第二个可以实现的功能就是全局数据绑定,这个功能需要和@ModelAttribute注解配合使用,代码如下: package com.example.demo.exception; import com.example.demo.module.User; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RestControllerAdvice; /** * 自定义全局数据处理器 */ @RestControllerAdvice public class DemoDataHandler { @ModelAttribute // @ModelAttribute(name = "userInfo") public User data() { User user = new User(); user.setName("李四"); user.setPhone("119"); return user; } }

spring——AOP原理及源码(四)

﹥>﹥吖頭↗ 提交于 2020-03-07 20:04:40
前情回顾:    上文 我们一路分析了从容器创建开始直到我们的AOP注解导入的核心组件AnnotationAwareAspectJAutoProxyCreator执行postProcessBeforeInstantiation()方法的整个过程   分析得到: 在所有bean创建之前,都会调用resolveBeforeInstantiation方法来试图返回一个代理对象 本篇预告 下图可以看到resolveBeforeInstantiation方法包含了 applyBeanPostProcessorsBeforeInstantiation(targetType, beanName); applyBeanPostProcessorsAfterInitialization(bean, beanName); 两个方法 在本篇我们将完整走完 resolveBeforeInstantiation 全过程,并一直到返回代理对象为止 调试的起点    开始调试,还是一路跳到下一断点,直到AbstractAutoProxyCreator.postProcessBeforeInstantiation()(从resolveBeforeInstantiation方法进入到这里的过程上一篇已经分析了) 可以看到当前的bean为org.springframework.context.event

spring源码学习之AOP(一)

谁说胖子不能爱 提交于 2020-03-07 08:20:18
  继续源码学习,看了spring中基础的容器和AOP感觉自己也没有什么长进,哈哈,我也不知道到底有用没有,这可能是培养自己的一种精神吧,不管那么多,继续学习!AOP中 AOP中几个重要的概念: (1)Advice--通知 Advice定义在连接点做什么,为切面增强提供织入接口。在spring中,他主要描述spring AOP围绕方法调用而注入的切面行为。在spring AOP的实现中,使用了AOP联盟定义的统一接口--Advice接口并通过这个接口,为AOP切面的增强的织入功能做了更多的细话和扩展 (2)PonitCut--切点 PonitCut(切点)决定Advice通知应该作用于哪个连接点,也就是说通过PonitCut来定义需要增强的方法的集合。这些集合的选取可以按照一定的规则来完成。这种情况下,PonitCut通常意味着标识方法,例如,这些需要增强的地方可以由某个正则表达式进行标识,或根据某个方法名进行匹配 (3)Advisor--通知器 完成对目标方法的切面增强设计(Advice)和关注点的设计(PointCut)以后,需要一个对象把它们结合起来,完成这个作用的就是Advisor,通过Advisor,可以定义在应该使用哪个通知并在哪个关注点使用它,也就是说通过Advisor,把Advice和PointCut结合起来,这个结合为使用IoC容器配置AOP应用

Spring中@Async注解实现异步 转

馋奶兔 提交于 2020-03-05 10:38:28
出处: Spring中@Async注解实现异步   异步执行一般用来发送一些消息数据,数据一致性不要求太高的场景,对于spring来说,它把这个异步进行了封装,使用一个注解就可以实现。   Spring中通过在方法上设置 @Async 注解,可使得方法被异步调用。也就是说该方法会在调用时立即返回,而这个方法的实际执行交给Spring的TaskExecutor去完成。 用法   程序启动时开启 @EnableAsync 注解 建立新的类型,建立 异步方法 ,为方法添加 @Async 注解 在业务代码中, @Autowired 注入你的类型,使用它即可 我们可以关注到在配置task的时候,是有参数让我们配置线程池的数量的。因为这种实现方法,所以在同一个类中的方法调用,添加@async注解是失效的!,原因是当你在同一个类中的时候,方法调用是在类体内执行的,spring无法截获这个方法调用. 事例 Spring的配置文件: <?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

AOP面试知识整理,^_^-包括spring Aop

妖精的绣舞 提交于 2020-03-04 23:50:07
讲到java企业级开发框架,就不可避免的讲到 IOC,AOP,MCV   今天面试时被问到AOP,讲的很乱,这里整理笔记,包括AOP,spring-AOP的部分知识,错误的地方请小伙伴指出来. 谈谈你对AOP的理解: AOP概念(Aspect-Oriented Programming): 即面向切面编程,与OOP(Object - Oriented Programming,面向对象编程)相辅相成,AOP的基本单元为Aspect(切面),Struts2 的拦截器设计就是基于AOP的思想。 AOP原理: 大型系统中的 通用的服务型的代码会穿插在各个业务类 ,方法中,随着系统规模的增大,会造成 大量的代码重复 ,,且与核心代码没有太多的关系。 系统中的业务可分为 核心关注点和横切关注点 , 核心关注点是业务处理的主要流程,横切关注点是与核心业务无关的通用业务。如日志权限 等,各个横切点离散的穿插与核心业务中。导致系统中的每一个模块代码都与这些业务具有很强的依赖性,当需要添加横切功能时,需要大幅修改已有的代码。 AOP即解决这个问题, 使用AOP框架,能够将这些影响多个类的通用性服务抽取出来,(即切面) ,并通过 配置的方式明确在那些位置插入这些服务, 系统运行后,AOP框架在指定的时机自动运行这些服务,从而达到核心业务逻辑和服务性逻辑分离的目的,减少了重复代码的

Spring常用注解

浪子不回头ぞ 提交于 2020-03-04 06:46:57
@Configuration :告诉Spring这是一个配置类,配置类===配置文件 @Bean :给容器注入一个bean,类型为返回值类型,id默认是用方法名作为id @Configuration //@ComponentScan value:指定要扫描的包 //excludeFilters=Filter[]:指定扫描的时候按照什么规则排除哪些组件 //includeFilters=Filter[]:指定扫描的时候只需要包含哪些组件,需要使这个起作用,还需要配置useDefaultFilters=false,禁用掉默认规则(扫描所有) /*@ComponentScan(value="com.atguigu.controller",includeFilters={@Filter(type=FilterType.ANNOTATION,classes=Controller.class)},useDefaultFilters=false)*/ @ComponentScan(value="com.atguigu.controller",excludeFilters={@Filter(type=FilterType.ANNOTATION,classes=Controller.class)}) public class MainConfig{ @Scope("prototype") @Bean

spring事务失效

谁都会走 提交于 2020-03-02 20:45:15
最近在做spring 项目中突然发现事务在遇到异常是没有回滚而是提交了,在查了大量的资料之后,算是有了一点头绪,写下来方便以后查找: 前些日子一朋友在需要在目标对象中进行自我调用,且需要实施相应的事务定义,且网上的一种通过BeanPostProcessor的解决方案是存在问题的。因此专门写此篇帖子分析why。 1、预备知识 aop概念请参考【 http://www.iteye.com/topic/1122401 】和【 http://jinnianshilongnian.iteye.com/blog/1418596 】 spring的事务管理,请参考【 http://jinnianshilongnian.iteye.com/blog/1441271 】 使用AOP 代理后的方法调用执行流程,如图所示 也就是说我们首先调用的是AOP代理对象而不是目标对象,首先执行事务切面,事务切面内部通过TransactionInterceptor环绕增强进行事务的增强,即进入目标方法之前开启事务,退出目标方法时提交/回滚事务。 2、测试代码准备 Java代码 public interface AService { public void a(); public void b(); } @Service() public class AServiceImpl1 implements AService

springboot 之Spring Web Mvc Framework

流过昼夜 提交于 2020-03-02 10:00:37
1、SpringMvc自动配置 Spring Boot 为SpringMvc提供了自动配置。 自动配置包含Spring的以下特征: (1)视图解析器ContentNegotiatingViewResolver或BeanNameViewResolver。 (2)支持静态文件,包含对WebJar支持。 (3)自动注册转换器Converter、GenericConverter、Formatter。 (4)支持HttpMessageConverters(转换request、response的数据格式) (5)注册MessageCodesResolver(转换错误代码) (6)支持静态index.html (7)支持Favicon (8)支持自动使用数据绑定器ConfigurableWebBindingInitializer 如果你想保持上述的特征并加入SpringMvc的其他配置(如interceptors、formatters、view controllers等),你要加入你自己的带有@Configuration注解的WebMvcConfigurerAdapter,且要有注解@EnableWebMvc。如果你想提供常用的句柄如RequestMappingHandlerMapping、RequestMappingHandlerAdapter

Spring个人笔记

断了今生、忘了曾经 提交于 2020-02-29 21:04:17
xml配置 1.xml基本结构: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="..." class="..."> <!-- collaborators and configuration for this bean go here --> </bean> <bean id="..." class="..."> <!-- collaborators and configuration for this bean go here --> </bean> <!-- more bean definitions go here --> </beans> 其中id是bean字符串,bean的唯一标识符,相当于对象名,class是bean类名的完全限定路径 2.别名