1、@Conditional简介@Conditional注解指示组件仅在所有指定条件匹配时才有资格注册。@Conditional注解的value属性就是条件匹配Class对象,具体说是Condition接口实例数组。@Target({ElementType.TYPE,ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceConditional{//必须匹配的所有条件才能注册组件Class<?extendsCondition>[]value();}@Conditional注释
一个bean定义扫描程序类,它检测类路径上的bean候选者,使用给定的注册表(BeanFactory或ApplicationContext)注册相应的bean定义。通过可配置的类型过滤器检测候选类。默认过滤器包括使用Spring的@Component,@Repository,@Service或@Controller构造型注释的类。还支持JavaEE6的javax.annotation.ManagedBean和JSR-330的javax.inject.Named注释(如果可用)。publicClassPathBeanDefinitionScanner(BeanDefinitionRegistry
1、什么是BeanValidationJSR-303(JSR是JavaSpecificationRequests的缩写,意思是Java规范提案)是JAVAEE6中的一项子规范,叫做BeanValidation,HibernateValidator是BeanValidation的参考实现。HibernateValidator提供了JSR303规范中所有内置constraint的实现,除此之外还有一些附加的constraint。meta-datacommentversion@Null对象,为空BeanValidation1.0@NotNull对象,不为空BeanValidation1.0@Asse
1、LifeCycle接口概述LifeCycle定义启动/停止生命周期控制方法的通用接口。这种情况的典型用例是控制异步处理。可以由两个组件(通常是Spring上下文中定义的Springbean)和容器(通常是SpringApplicationContext本身)实现。容器将开始/停止信号传播到每个容器内应用的所有组件。可用于通过JMX进行直接调用或管理操作,org.springframework.jmx.export.MBeanExporter通常使用org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssemble
同步客户端执行HTTP请求,在底层HTTP客户端库(如JDKHttpURLConnection,ApacheHttpComponents等)上公开简单的模板方法API。RestTemplate除了支持频率较低的情况的通用交换和执行方法之外,还通过HTTP方法提供常见方案的模板。注意:从5.0开始,非阻塞,反应式org.springframework.web.reactive.client.WebClient提供了RestTemplate的现代替代方案,同时有效支持同步和异步以及流方案。RestTemplate将在未来版本中弃用,并且不会在未来添加主要的新功能。1、构造函数publicRestT
在SpringMVC中处理HTTP请求时如果抛出异常会使用DispatcherServlet#processHandlerException()处理,这个方法内部使用SpringMVC默认的注册的HandlerExceptionResolver进行处理。@NullableprotectedModelAndViewprocessHandlerException(HttpServletRequestrequest,HttpServletResponseresponse,@NullableObjecthandler,Exceptionex)throwsException{//Successander
上一篇《SpringMVC设计原理》中提到了SpringMVC在使用RequestMappingHandlerAdapter处理HTTP请求时会进行参数绑定,参数绑定会在两种方法上发生:@RequestMapping方法的参数绑定@ModelAttribute方法的参数绑定1、参数解析器的初始化这两种参数绑定分别使用一个HandlerMethodArgumentResolverComposite对象,只不过这个对象内部使用两套HandlerMethodArgumentResolver。HandlerMethodArgumentResolverComposite的初始化是在RequestMapp
1、SpringMVC请求处理流程概述DispatcherServlet是SpringMVC中的前端控制器(FrontController),负责接Request并将Request委托特殊bean处理请求并呈现适当的响应。Bean类型描述HandlerMapping将请求映射到处理程序以及用于预处理和后处理的拦截器列表。映射基于某些标准,其细节因HandlerMapping实现而异。两个主要的HandlerMapping实现是RequestMappingHandlerMapping(它支持@RequestMapping带注释的方法)和SimpleUrlHandlerMapping(它维护对处理
1、SpringBean作用域简介bean定义的配方是很重要的,因为这意味着,对于一个类,你可以使用一个配方创建许多对象实例。你不仅可以通过特定的bean定义控制各种依赖关系和配置值创建一个对象,还控制创建的对象的作用域。这种方法是强大和灵活的,因为你可以选择您创建的对象的作用域通过配置,而不是靠对象在Java类级别的作用域。可以定义bean被部署在一个作用域。Spring框架支持六个作用域,其中四个作用域需要使用带有Web功能的ApplicationContext(AbstractRefreshableWebApplicationContext)。您还可以创建一个自定义作用域。下表描述了支持
1、Spring远程调用的设计概览Spring为使用各种技术的远程支持提供集成类。远程支持简化了由通常的(Spring)pojo实现的支持远程的服务的开发。目前,Spring支持以下远程处理技术:RemoteMethodInvocation(RMI):通过使用RmiProxyFactoryBean和RmiServiceExporter,Spring同时支持传统的RMI(使用java.rmi.Remote远程接口和java.rmi.RemoteException)以及通过RMI调用程序进行的透明远程处理(使用任何Java接口)。Spring’sHTTPinvoker:Spring提供了一种特殊的
@EnableTransactionManagement启用Spring的注解驱动的事务管理功能,它背后的处理器是TransactionManagementConfigurationSelector,在使用ASPECTJ模式它会导入AspectJJtaTransactionManagementConfiguration和AspectJTransactionManagementConfiguration用于基于ASPECTJ代理模式实现基于注解的事物实现,这里主要讨论PROXY模式基于接口的JDK动态代理模式:两个核心组件一个是AutoProxyRegistrar用于注册一个自动代理创建者(AP
1、设计原理与基本过程在使用Spring声明式事务处理的时候,一种常用的方法是结合IoC容器和Spring已有的TransactionProxyFactoryBean对事务管理进行配置,比如,可以在这个TransactionProxyFactoryBean中为事务方法配置传播行为、并发事务隔离级别等事务处理属性,从而对声明式事务的处理提供指导。具体来说,在以下的内容中,在对声明式事务处理的原理分析中,声明式事务处理的实现大致可以分为以下几个部分:读取和处理在IoC容器中配置的事务处理属性,并转化为Spring事务处理需要的内部数据结构。具体来说,这里涉及的类是TransactionAttrib
1、Spring事物处理的编程式使用TransactionDefinitiontd=newDefaultTransactionDefinition();Transactionstatusstatus=transactionManager.getTransaction(td);try{//这里是需要进行事务处理的方法调用}catch(ApplicationExceptione){transactionManager.rollback(status);throwe;}transactionManager.commit(status);在编程式使用事务处理的过程中,利用DefaultTransact
1、设计原理在SpringJDBC中,JdbcTemplate是一个主要的模板类,从类继承关系上来看,JdbcTemplate继承了基类JdbcAccessor和接口类JdbcOperation。在基类JdbcAccessorl的设计中,对DataSource数据源进行管理和配置。在JdbcOperation接口中,定义了通过JDBC操作数据库的基本操作方法,而JdbcTemplate提供这些接口方法的实现比如execute方法、query方法、update方法等。JdbcOperations中有一系列execute()方法并且要求传入一个Callback函数,此接口的其他方法如query()
Spring框架提供了基于注解@Cacheable、@CacheEvict、@CachePut、@Caching、@CacheConfig的缓存功能,@EnableCaching用于开启基于注解的缓存功能,下面分析一下Spring基于注解缓存的实现原理。@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(CachingConfigurationSelector.class)public@interfaceEnableCaching{booleanproxyTargetClass()defa
1、概述@EnableScheduling启用Spring的定时任务功能,这允许检测容器中@Scheduled注释的bean。执行定时任务还需要一个调度器TaskScheduler,默认情况下,将在容器中搜索一个关联的scheduler定义:要么是一个唯一的TaskScheduler类型的bean,要么是一个beanname是taskScheduler的TaskScheduler。这两种查找的都是。ScheduledExecutorService。如果这两种查找方式都没有,则默认使用一个单线程的调度器。实现SchedulingConfigurer}允许细粒度通过ScheduledTaskReg
上一篇文章《Spring异步实现原理》中提到执行异步方法使用了AsyncTaskExecutor,这篇就讲解一下TaskExecutor的实现类原理。1、TaskExecutor概述Executors是JDK线程池概念的名字。“executor”命名是由于它并不能保证底层实现实际上是一个池。一个executor可能是单线程的,甚至是同步的。Spring的抽象隐藏了实现细节。Spring的TaskExecutor接口和java.util.concurrent.Executor接口是相同的。事实上,其主要原因是最初需要Java5才能使用线程池。@FunctionalInterfacepublici
@EnableAsync用于开启Springbean异步方法的能力。下面是注解EnableAsync的定义。@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(AsyncConfigurationSelector.class)public@interfaceEnableAsync{//默认只赋予@Async和@javax.ejb.Asynchronous方法异步的能力,可通过该属性覆盖扩展Class<?extendsAnnotation>annotation()defaultA
1、AnnotationAwareAspectJAutoProxyCreator注册过程Spring应用如果想开启基于注解形式的AOP代理,只需要在@Configuration类上加入@EnableAspectJAutoProxy,因为EnableAspectJAutoProxy上有@Import(AspectJAutoProxyRegistrar.class),就可以在bean加载阶段调用AspectJAutoProxyRegistrar.registerBeanDefinitions()方法,具体原理请看《ConfigurationClassPostProcessor原理》。@Target
1、为什么需要TargetSourceTargetSource(目标源)是被代理的target(目标对象)实例的来源。publicinterfaceTargetSourceextendsTargetClassAware{//目标对象类型Class<?>getTargetClass();//这个方法用户返回当前bean是否为静态的,比如常见的单例bean就是静态的,而prototype就是动态的,//这里这个方法的主要作用是,对于静态的bean,spring是会对其进行缓存的,在多次使用TargetSource//获取目标bean对象的时候,其获取的总是同一个对象,通过这种方式提高效
1、设计原理在Spring的AOP模块中,一个主要的部分是代理对象的生成,而对于Spring应用,可以看到,是通过配置和调用Spring的ProxyFactoryBean和ProxyFactory来完成这个任务的。在ProxyFactoryBean中,封装了主要代理对象的生成过程。在这个生成过程中,可以使用JDK的Proxy和CGLIB两种生成方式。以ProxyFactory的设计为中心,可以看到相关的类继承关系如图所示。在这个类继承关系中,可以看到完成AOP应用的类,比如AspectJProxyFactory、ProxyFactory和ProxyFactoryBean,它们都在同一个类的继承
1、AOP概念Aspect:切面是一个关注点的模块化,这个关注点可能是横切多个对象。在SpringAOP中切面是常规的类(基于xml配置)或者是带有@Aspect注解的类实现的。Joinpoint:连接点是程序执行的一个方法或者一个可处理的异常。在SpringAOP中,连接点总是代表执行方法。Advice:通知是切面拦截到连接点之后所要采取的行动。通知类型分为“环绕”,“前置”和“后置”通知。Spring框架的一个通知作为一个拦截器,并且维护了一个拦截器链环绕连接点。Pointcut:指匹配连接点的断言。通知与一个切入点表达式关联,并在满足这个切入的连接点上运行,例如:当执行某个特定的名称的方
ApplicationContext提供事件处理通过ApplicationEvent类和ApplicationListener接口。如果一个bean实现ApplicationListener接口在容器中,每次一个ApplicationEvent被发布到ApplicationContext中,这类bean就会收到这些通知。从本质上讲,这是标准的观察者设计模式。实现Spring事件机制主要有4个类:ApplicationEvent:事件,每个实现类表示一类事件,可携带数据。ApplicationListener:事件监听器,用于接收事件处理时间。ApplicationEventMulticaste
1、ConfigurationClassPostProcessor如何应用ConfigurationClassPostProcessor在Spring启动时为我们自动注册的当我们使用了XmlWebApplicationContext并在配置文件中配置了context:annotation-config/或context:component-scan/元素,XmlWebApplicationContext的loadBeanDefinitions()方法会使用XmlBeanDefinitionReader.loadBeanDefinitions(Resource)方法在内部注册一个Configur
CommonAnnotationBeanPostProcessor这个BeanPostProcessor通过继承InitDestroyAnnotationBeanPostProcessor对@javax.annotation.PostConstruct和@javax.annotation.PreDestroy注解的支持。以及依据beanname依赖注入的@javax.annotation.Resource支持。也支持WebServiceRef注解,具有创建JAX-WS服务端点的能力。最后,处理器还支持EJB3(@EJB)。1、对@PostConstruct和@PreDestroy注解的处理Co
@Required注释应用于bean属性的setter方法,它表明受影响的bean属性在配置时必须放在XML配置文件中,否则容器就会抛出一个BeanInitializationException异常。RequiredAnnotationBeanPostProcessor就是用来解析@Required的,当一个bean实例经过SmartInstantiationAwareBeanPostProcessor的postProcessPropertyValues()方法时,检测bean中属性对应的setter方法被标记@Required但是用于赋值的PropertyValues对象不包含此属性就会抛出
AutowiredAnnotationBeanPostProcessor继承了InstantiationAwareBeanPostProcessorAdapter间接实现了SmartInstantiationAwareBeanPostProcessor接口覆盖了determineCandidateConstructors()方法,此方法在实例化bean前选取一个构造方法数组,请参考bean创建的流程https://blog.csdn.net/shenchaohao12321/article/details/80441204和https://blog.csdn.net/shenchaohao12
ConfigurationClassPostProcessor是一个BeanDefinitionRegistryPostProcessor,用于在Spring启动时处理以Java类定义形式的配置。@OverridepublicvoidpostProcessBeanDefinitionRegistry(BeanDefinitionRegistryregistry){intregistryId=System.identityHashCode(registry);if(this.registriesPostProcessed.contains(registryId)){thrownewIllegal
A代表通过addBeanFactoryPostProcessor或addBeanPostProcessor方法直接添加为相应的组件后面的数字代表此组件在代码层面出现的先后顺序之后为组件的类名bean的name继承了PriorityOrdered还是OrderedOrdered或PriorityOrdered的优先级
DispatcherServlet中WebApplicationContext的启动在父类FrameworkServlet的configureAndRefreshWebApplicationContext()方法中,其中WebApplicationContext的具体子类是AnnotationConfigWebApplicationContext。下图为ApplicationContext的继承结构。protectedvoidconfigureAndRefreshWebApplicationContext(ConfigurableWebApplicationContextwac){if(Obj