喜欢研究技术的码农
SpringMVC的DispatcherServlet的默认策略 在使用SpringMVC的时候,我们知道需要HandlerMapping定义请求路径与处理器之间的映射,需要HandlerAdapter来调用处理器方法并返回一个ModelAndView对象,需要ViewResolver来解析视图。
Spring之util命名空间 util命名空间可以帮助我们快速的定义list、map、set等。如果要使用它,我们首先需要在XML配置文件中引入其对应的namespace。 定义Properties 可以通过util:properties快速的定义一个Properties对象,可以通过其子元素来定义一个Properties的元素,key对应属性名,而元素中间的文本值则为对应的属性值。
SpringMVC路径匹配中使用通配符 @RequestMapping中指定的路径也可以使用通配符*,表示任意字符。如下的处理器方法可以映射请求/antstyle/a,可以映射请求/antstyle/b,但是它不能映射请求请求/antstyle/a/b,因为它只能映射一级路径。
elastic-job允许用户在任务调度异常时指定处理异常的异常处理器,异常处理器由接口JobExceptionHandler定义,其定义如下: /** * 作业异常处理器.
SpringMVC内置了对文件上传的支持,它需要我们配置一个MultipartResolver,Servlet3之前它只有一个基于commons-fileupload的实现CommonsMultipartResolver,笔者以前也写过一篇基于CommonsMultipartResolver的文件上传的博文,地址是http://elim.iteye.com/blog/1188116。
每个作业都可以配置一个任务监听器,确切的说是只能配置一个本地监听器和一个分布式监听器。Elastic-job有三种作业类型,但是它们的通用配置都是一样的,所以本文在介绍作业的监听器配置时将仅以简单作业的配置为例。
脚本作业是用来定时调度脚本文件的,如windows的cmd,linux上的shell文件,在调度的时候会把当前调度的ShardingContext的转化为一个JSON串作为脚本调度的参数进行传递。
流式作业对应于DataflowJob接口,其定义如下: /** * 数据流分布式作业接口. * * @author zhangliang * * @param 数据类型 */ public interface DataflowJob extends ElasticJob { /** * 获取待处理数据.
路径变量中使用正则表达式匹配 SpringMVC的处理器映射的请求路径中是可以包含路径变量的,语法是{pathVar},如下面的请求路径映射中就定义了一个路径变量var,则在访问时该变量可以是任意的值,所以在请求时/pathvariable/a、pathvariable/bcd等形式的请求路径都可以映射到下面的处理器方法。
简介 elastic-job是当当网开源的基于zookeeper和quartz实现的分布式作业调度框架。github地址是https://github.com/dangdangdotcom/elastic-job,官方网站是http://elasticjob.io/。
1.创建group shell> groupadd mysql 2.创建user shell> useradd -r -g mysql -s /bin/false mysql 3.解压缩mysql压缩包到你想要安装的目录,解压缩时可以使用-C指定解压到的目标目录。
编程式的自定义Advisor 概述 大多数情况下,我们的Aop应用都可以通过Spring的Aop配置来进行(不管是基于注解的,还是基于XML配置的)。Spring Aop的核心就是Advisor,Advisor接口中暂时有用的就是getAdvice()方法,而isPerInstance()方法官方说暂时还没有应用到,生成的Advisor是单例还是多例不由isPerInstance()的返回结果决定,而由自己在定义bean的时候控制。
Spring Aop原理之Advised接口 通过之前我们介绍的ProxyFactory我们知道,Spring Aop是通过ProxyFactory来创建代理对象的。ProxyFactory在创建代理对象时会委托给DefaultAopProxyFactory.createAopProxy(AdvisedSupport config),DefaultAopProxyFactory内部会分情况返回基于JDK的JdkDynamicAopProxy或基于CGLIB的ObjenesisCglibAopProxy,它俩都实现了Spring的AopProxy接口。
Aop自动创建代理对象的原理 我们在使用Spring Aop时,通常Spring会自动为我们创建目标bean的代理对象,以使用对应的Advisor。前提是我们在使用Spring Aop时是使用的或,这是因为当我们在applicationContext.xml文件中通过的形式定义需要使用Aop的场景时,Spring会自动为我们添加AspectjAwareAdvisorAutoProxyCreator类型的bean;而我们定义了时,Spring会默认为我们添加AnnotationAwareAspectjAutoProxyCreator类型的bean。
ProxyFactoryBean创建代理对象 ProxyFactoryBean实现了Spring的FactoryBean接口,所以它跟Spring中的其它FactoryBean一样,都是基于工厂模式来获取一个bean的。
调用存储过程 mybatis调用存储过程时需要指定statementType="CALLABLE",这样Mybatis内部中调用sql语句时将采用CallableStatementHandler,而CallableStatementHandler内部将使用CallableStatement来调用存储过程。
编程式的创建Aop代理之AspectjProxyFactory 之前已经介绍了一款编程式的创建Aop代理的工厂——ProxyFactory,其实ProxyFactory拥有的功能AspectjProxyFactory都有。
编程式的创建Aop代理之ProxyFactory Spring Aop是基于代理的,ProxyFactory是Spring Aop内部用来创建Proxy对象的一个工厂类。如果我们需要在程序运行时来动态的应用Spring Aop,则我们可以考虑使用ProxyFactory。
编程式的Pointcut 除了可以通过注解和Xml配置定义Pointcut之外,其实我们还可以通过程序来定义Pointcut。Spring Aop的切入点(Pointcut)对应于它的一个Pointcut接口,全称是org.springframework.aop.Pointcut。
基于正则表达式的Pointcut JdkRegexpMethodPointcut Spring官方为我们提供了一个基于正则表达式来匹配方法名的Pointcut,JdkRegexpMethodPointcut。
8 advisor标签 advisor标签是需要定义在aspect标签里面的,其作用与aspect类似,可以简单的把它理解为一个特殊的切面,用于把一个Advice和一个Pointcut组合起来。
7 基于XML配置的Spring AOP 基于XML配置的Spring AOP需要引入AOP配置的Schema,然后我们就可以使用AOP Schema下定义的config、aspect、pointcut等标签进行Spring AOP配置了。
PathMatchingResourcePatternResolver可以用来解析资源文件,主要是用来解析类路径下的资源文件。当然它也可以用来解析其它资源文件,如基于文件系统的本地资源文件。
Ehcache提供了基于JMX的监控支持,支持对以下几类信息的监控。 CacheManager Cache CacheConfiguration CacheStatistics 按照JMX的规范,为了支持对这几类信息的监控支持,Ehcache分别为它们建立了对应的MBean接口,这些接口都定义在net.sf.ehcache.management包中,分别是CacheManagerMBean、CacheMBean、CacheConfigurationMBean和CacheStatisticsMBean。
6 @DeclareParents介绍 @DeclareParents注解也是Aspectj提供的,在使用基于Aspectj注解的Spring Aop时,我们可以在切面中通过@DeclareParents指定满足指定表达式的类将自动实现某些接口。
5 给Advice传递参数 Advice除了可以接收JoinPoint(非Around Advice)或ProceedingJoinPoint(Around Advice)参数外,还可以直接接收与切入点方法执行有关的对象,比如切入点方法参数、切入点目标对象(target)、切入点代理对象(this)等。
4 基于Aspectj注解的Advice介绍 之前介绍过,Advice一共有五种类型,分别是before、after return、after throwing、after(finally)和around。
3 Pointcut表达式介绍 3.1 表达式类型 标准的Aspectj Aop的pointcut的表达式类型是很丰富的,但是Spring Aop只支持其中的9种,外加Spring Aop自己扩充的一种一共是10种类型的表达式,分别如下。
ClassPathBeanDefinitionScanner继承自ClassPathScanningCandidateComponentProvider,构造时要求指定一个BeanDefinitionRegistry对象,其扩展了一个scan方法,可以同时指定多个要扫描的包。
2 基于Aspectj注解的Spring Aop简单实现 Spring Aop是基于Aop框架Aspectj实现的,它不是完完全全的对Aspectj框架进行扩展和改造,而是利用Aspectj里面的一些功能来实现自己的Aop框架,其中就包括对Aspectj提供的注解的解析。
1 Aop简介 AOP的全称是Aspect Oriented Programming,翻译成中文是面向切面编程。它的主要思想是在程序正常执行的某一个点切进去加入特定的逻辑。AOP框架中对AOP支持最完整的是Aspectj,Spring Aop是基于Aspectj实现的专门针对于Spring自身支持的Aop,它的功能没有Aspectj那么完整,它只作用于Spring bean容器中bean对象的某个方法的执行。
Java Webservice指定超时时间 使用JDK对Webservice的支持进行Webservice调用时通常的操作步骤如下: //1、创建一个javax.xml.ws.Service实例 javax.
JedisConnectionException Connection Reset 使用Jedis的subscribe进行消息订阅时有时会抛出JedisConnectionException:Connection Reset,查看redis-server控制台,发现有如下信息输出: subscribe scheduled to be closed ASAP for outcoming of output buffer limits 从字面意思来看是消息输出的缓冲区已经超出了限制,所以订阅的链接被关闭了。
24 自定义BeanDefinitionRegistryPostProcessor BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProcessor,是一种比较特殊的BeanFactoryPostProcessor。
23.2.24 设置默认值 SpEl表达式中支持“a?:b”这样的语法来设置默认值。其表示如果a不为null时其结果为a,否则就为b。 @Test public void test24 () { ExpressionParser parser = new SpelExpressionParser(); Assert.
23.2.16 new对象 SpEl支持我们直接在表达式中使用Java中new对象的语法来new一个对象,在new对象的时候需要我们指定对应类的包名,java.lang包除外。如下示例中我们就在表达式中new了一个java.util.Date对象,然后调用了其toLocaleString()方法。
23.2.9 构造List 在SpEl中可以使用“{e1,e2,e3}”的形式来构造一个List,如下示例中我们就构造了一个List。 @Test public void test09() { ExpressionParser parser = new SpelExpressionParser(); List intList = (List)parser.
23 SpEl 23.1 简介 Spring也有自己的EL,叫Spring Expression Language,简称SpEl。其可以在程序中单独使用,也可以在Spring应用中进行bean定义时使用。
22 ApplicationEvent Spring允许我们在ApplicationContext中发布ApplicationEvent事件,然后对应的ApplicationListener可以用来监听对应的事件。
21 国际化MessageSource Spring中定义了一个MessageSource接口,以用于支持信息的国际化和包含参数的信息的替换。MessageSource接口的定义如下,对应的方法说明已经在方法上注释了。
20 @PropertySource 在之前介绍时提到过其默认会使用PropertySourcesPlaceholderConfigurer来进行对应的属性替换,其底层有使用PropertySource。
19.2 指定启用的profile 前面已经介绍了profile的指定,我们知道指定了profile后则表示对应的内容只有在特定的profile下才会生效。当前应用究竟使用的是哪个profile,或者是哪些profile,这是需要我们来指定的。
19 Profile 有的时候我们可能需要在不同的环境下使用不同的bean定义,如在开发环境直接使用直接定义的数据源,而在生产环境使用对应的JNDI数据源等。针对这种需求,Spring给我们引入了一个profile的概念,其允许我们将在特定环境下需要使用的bean定义为不同的profile,然后只有在对应的profile激活的情况下才使用对应的bean定义。
18.4 组合多个配置 通常在使用基于Java类的配置时我们可能不是单独使用一个Java类进行配置,有的时候可能会建立多个Java类进行配置,也可能是基于Java类的配置和基于XML的配置一起使用,这就需要我们将多个配置整合在一起了。
18.2 @Configuration @Configuration是标注在Class上的,当我们需要基于Java类的形式对Spring进行配置时,我们就需要在对应的配置类上使用@Configuration进行标注,这样Spring才会把对应的Class当做是一个配置用的Class。
18 使用Java类的形式配置bean定义 除了传统的使用XML来配置底层的bean容器定义,Spring还支持使用大家熟悉的Java类的形式来进行配置。使用Java类的形式来进行配置时我们将使用一个Java类来作为配置的主体,并在类上使用@Configuration进行标注,表示其是一个配置类。
17 对JSR330标准注解的支持 除了使用Spring标准的注解来定义bean、定义bean之间的依赖关系外,Spring还支持使用JSR330标准的注解来进行相关的定义,主要是对@Inject和@Named两个注解的支持。
16.5 过滤器 默认情况下,Spring将扫描所有@Component、@Controller、@Service和@Repository标注的类,以及这几个注解所派生出来的注解所标注的类,如之前介绍的自定义的@MyComponent注解,并将它们作为一个bean定义在对应的bean容器中。
16 使用注解进行bean定义 除了在Spring配置文件中通过bean元素定义一个bean外。我们还可以通过在Class上使用特定的注解进行标注,然后让Spring去扫描这些特定的注解,并把它们当做一个bean进行定义。