1、前言:

既然说到了“组合注解”,从字面意思就是多个注解组合后形成一个新的注解。所以首先来说明下,可以注解到其余注解类上面的被称为“元注解”,而被注解的注解就称为组合注解。

2、组合注解的好处:

  • 简化注解配置,用很少的注解来标注特定含义的多个元注解。
  • 提供了很好的扩展性,可以根据实际需要灵活的自定义注解。

3、如果使用自定义组合注解?

第一步:自定义一个组合注解


WiselyConfiguration



@Target           (ElementType.TYPE)          
           @Retention           (RetentionPolicy.RUNTIME)          
           @Documented          
           @Configuration            //实际上就是一个bean注解          
           @ComponentScan             //自动扫描对应value(package路径)值下面的所有bean          
           public            @interface            WiselyConfiguration {          
                      String[] value()            default            {};           //可以不写,实际在@ComponentScan注解中已经定义过,所以可以拿过来直接用          
           }


第二步:使用自定义注解


ElConfig



//@Configuration //属性注解          
           //@ComponentScan("com.gdb.spingboot.service")  // 要扫描的bean路径          
           @WiselyConfiguration           (value =            "com.gdb.spingboot.service"           )            // 自定义注解,扫描的所有的bean来源于value值所对应的包路径下          
           public            class            ElConfig {}


说明:组合注解,和上面两个注解实现的功能完全一致,所以如果在繁琐的注解被多次使用的情况下,可以考虑自定义注解。

4、举例说明

说明:实际上说了上面的内容,主要是告诉大家,如果某一个注解在不知道怎么用的,完全可以进入对应的注解类下,看看其被哪些注解所“注解”,一直追踪到熟悉的注解即可。

举例:@RestController。


RestController


@Target           (ElementType.TYPE)          


           @Retention           (RetentionPolicy.RUNTIME)          


           @Documented          


           @Controller            //重点          


           @ResponseBody            //重点          


           public            @interface            RestController {          


                      String value()            default            ""           ;          


                      


           }


说明:可以明显的看到其实现了@Controller(而@Controller被Component注解,也就是加载Bean)、@ResponseBody。所以在一个接口想返回非html,而是json、xml的情况下,就可以使用此注解来实现。


AccountController

@RestController          
           public            class            AccountController {          
                      @RequestMapping           (           "register/account"           )          
                      public            Object  test(HttpServletRequest request) {          
                      //执行代码          
                      //返回的就是json的,而不是一个渲染的html页面          
                      }          
           }          
           /**          
           * 等同于以下代码          
           */          
                      @Controller          
                      public            class            AccountController {          
                      @ResponseBody          
                      @RequestMapping           (           "register/account"           )          
                      public            Object test(HttpServletRequest request) {          
                      //执行代码          
                      //返回的就是json的,而不是一个渲染的html页面}          
           }


5、扩展说明

除了这种组合注解,还有用不同的注解来区分业务层或者是一些其他的特殊含义的代码类。典型的就是:@Service、@Repository、@Controller都被@Component注解,并且本身没有什么特殊实现(当前所有的spring版本都没有特殊实现),也就是实际上这些注解都是通用的,但是其很好的区分各个层,也就慢慢的形成了“规范”。

  • @Service服务层组件,用于标注业务层组件,表示定义一个bean,自动根据bean的类名实例化一个首写字母为小写的bean,例如Chinese实例化为chinese,如果需要自己改名字则:@Service("你自己改的bean名")。
  • @Controller用于标注控制层组件(如struts中的action)
  • @Repository持久层组件,用于标注数据访问组件,即DAO组件。