当前位置: 首页 > 科技观察

详解JavaSpring的JavaConfig注解

时间:2023-03-22 16:45:19 科技观察

sequence传统的spring一般都是基于xml配置的,但是后来加入了很多JavaConfig注解。特别是springboot,基本上都是javaconfig。如果你不了解它,那它真的不合适。注意这里。@RestControllerspring4为了更方便的支持restfull应用的开发,增加了RestController注解。比Controller注解更多的作用是默认在最底层的RequestMapping方法中添加ResponseBody注解,省得你一个一个去添加注解。@Configuration这个类被标记为一个spring配置类。它带有自己的组件注释@ImportResource,对应于xml存在的必要性。这与传统的xml配置兼容。毕竟JavaConfig还不够完善,比如JavaConfig对aop:advisor和tx:advice的支持不是很好,引入@EnableAspectJAutoProxy(相当于aop:aspectj-autoproxy),引入@Configuration-based相当于aop:configXML元素@ComponentScan对应的xml该配置自动包含如下配置功能:是向Spring容器注册AutowiredAnnotationBeanPostProcessor(使用@Autowired必须注册)、CommonAnnotationBeanPostProcessor(使用@Resource、@PostConstruct、@PreDestroy等时必须注册)、PersistenceAnnotationBeanPostProcessor(使用@PersistenceContext时必须注册)、RequiredAnnotationBeanPostProcessor(使用@Required时必须注册).值得注意的是,Spring3.1RC2版本不允许被Configuration注解的类在ComponentScan指定的包范围内,否则会报错。@Bean对应的xml如下:@EnableWebMvc对应的xml如下:这个配置自动注册DefaultAnnotationHandlerMapping(注册handler方法和request的映射关系)和AnnotationMethodHandlerAdapter(在实际调用handler方法之前处理它的参数)两个bean来支持@Controller注解的使用。主要功能如下:ConfigurableConversionService(方便自定义类型转换)支持@NumberFormat格式化数值类型字段支持@DateTimeFormat格式化Date、Calendar、JodaTime字段(如果classpath有JodaTime)支持@Valid参数验证(如果JSR-303相关提供者在类路径上)支持XML读写@RequestBody/@ResponseBody注解(如果JAXB在类路径上)支持JSON读写@RequestBody/@ResponseBody注解(如果Jackson在类路径上)words)@??ContextConfiguration主要指定junit测试时的javaconfig@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration({"classpath*:spring/*.xml","classpath:applicationContext.xml","classpath:applicationContext-rabbitmq.xml""classpath:applicationContext-mail.xml","classpath:applicationContext-medis.xml","classpath:applicationContext-mybatis.xml"})@TransactionConfiguration(transactionManager="mybatisTransactionManager",defaultRollback=false)publicclassAppBaseTest{//......}@ResponseStatus主要用于rest开发,注解返回的http返回码,具体取值见org.springframework.http.HttpStatus枚举一般post方法返回HttpStatus.CREATED,DELETE和PUT方法返回HttpStatus.OK。也可以配置异常处理,见@ExceptionHandler和@ControllerAdvice@ExceptionHandler主要用于处理指定的异常,并返回指定的HTTP状态码,省去了各个controller自己trycatch的方法。一般可以为每个应用定义一个异常基类,然后定义业务异常,这样就可以在这里统一捕获业务异常。@ExceptionHandler(BizException.class)@ResponseStatus(HttpStatus.BAD_REQUEST)public@ResponseBodyReturnMessagebizExceptionHandler(Exceptionex){logger.error(ex.getMessage(),ex);returnnewReturnMessage(HttpStatus.BAD_REQUEST).getMessage(;}不过值得注意的是,这个方法仅限于controller的方法调用链产生的异常,如果在spring中使用定时任务,则不会拦截这个注解@ControllerAdvice与@ExceptionHandler一起使用来拦截控制器的方法。@ControllerAdvicepublicclassErrorController{privatestaticfinalLoggerlogger=LoggerFactory.getLogger(ErrorController.class);@ExceptionHandler(BizException.class)@ResponseStatus(HttpStatus.BAD_REQUEST)public@ResponseBodyReturnMessagebizExceptionHandler(Exceptionex){logger.error(ex.getMessage(),ex);returnnewReturnMessage(HttpStatus.BAD_REQUEST.value(),ex.getMessage());}@ExceptionHandler(Exception.class)@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)public@ResponseBodyReturnMessageserverExceptionHandler(Exceptionex){logger.error(ex.getMessage(),ex);returnnewReturnMessage(HttpStatus.INTERNAL_SERVER_ERROR.value(),ex.getMessage());}}