美文网首页
Spring注解总结

Spring注解总结

作者: 帅可儿妞 | 来源:发表于2018-10-14 21:15 被阅读69次

逐渐的,在Spring的开发过程中,注解的使用越来越频繁,之前一直不喜欢注解,因为个人觉得可读性不好,但是正是这个原因使得自己不愿意花时间在这个上面花费时间研究,大势所趋,要学的是逃不掉的,于是就整理了一番,见到的都整理到这里,和其他文章一样,这篇文章不会一蹴而就,而是会逐渐更新,有新的就会更新到这里,谢了

一、注解总览

  1. Spring注解
    • @Configuration
    • @Bean
    • @Scope
    • @Lazy
    • @Conditional
    • @ComponentScan
    • @Import
    • @Value
    • @PropertySource
    • @ConfigurationProperties
    • @AutoWired
    • @Profile
    • AOP相关
      • @Before
      • @After
      • @AfterReturning
      • @AfterThrowing
      • @Around
      • @Pointcut
      • @Aspect
      • @EnableAspectJAutoProxy
    • 声明式事务
      • @Transactional
      • @EnableTransactionManagement
  2. SpringMVC注解
    • 常见注解
      • @Controller
      • @ResponseBody
      • @RestController
      • @ModelAttribute
      • @SessionAttributes
      • @requestParam
      • @RequestHeader
      • @CookieValue
      • @PathVariable
      • @Component
      • @Repository
    • SpringMVC的整合
      • 其他的配置
  3. 原生JavaWeb注解

二、注解解释

  1. Spring注解
    • @Configuration
      • 被该注解标注的类对应于之前配置开发的applicationContext.xml
    • @Bean
      • 被该注解标注的方法相当于之前在applicationContext.xml中的一个<bean ... />配置;
      • 返回值类型就是<bean ... />中的class属性的值,方法名就是<bean ... />中的id属性的值;
      • 参数中可以指定initMethod和destroyMethod方法
        ✔ 还有一种方式,就是我们的bean实现两个接口:InitializingBean和DisposableBean即可(记得给Bean添加@Component);
        ✔ @PostConstruct和@PreDestroy:这两个配置在Bean的初始化和销毁的方法上(记得给Bean添加@Component);
        ✔ 接口:BeanPostProcessor,初始化前后调用定义的两个方法(记得给Bean添加@Component);
      • 对应的Bean方法也可以添加参数,但是这个参数必须能在Spring容器中唯一定位;
    • @Scope
      • 作用在配置类的方法上,用来提到<bean ... />scope属性;
    • @Lazy
      • 作用在配置类的方法上,用来使得单例的对象也延迟加载;
    • @Conditional
      • 有条件的把标注的方法返回的对象注入到Spring容器中;需要自定义一个实现了Spring的Condition的类,添加到注解的参数即可;
    • @ComponentScan
      • 该注解主要标注在配置类上,相当于applicationContext.xml中的<context:conponent-scan ··· />
    • @Import
      • 原生类导入
        ✔ 直接把一些类放在@Import的参数中,就可以把这个类导入到Spring的容器中;
      • ImportSelector
        ✔ 用来给打@Import的类批量的,有选择的导入一些类到Spring的容器中;@Import参数是实现了ImportSelector接口的类,返回的是要注入的类的全类名字符串;
      • ImportBeanDefinitionRegistrar
        ✔ 手动注册类,@Import参数是实现了ImportBeanDefinitionRegistrar接口的类,没有返回值;
    • @Value
      • 用来给Bean的字段赋值
        ✔ 参数为字面量
        ✔ 参数为SpEL,用来计算:#{}
        ✔ 参数为${},用来获取配置文件的值,配合@PropertySource使用;
    • @PropertySource
      • 用来加载配置文件,标注在配置类上;
    • @ConfigurationProperties
      • 用来把application.properties/yml配置文件中的属性注入到Bean中,所以一般添加在配置类的方法上,当然也可以添加在类上;
        @ConfigurationProperties(prefix="<key-in-properties/yml>")
        
    • @AutoWired
      • 自动把容器中的对象装载进打了该标签的变量;先按照类型找,在按照变量名称找,如果要指定要装配的组件,配合使用@Qualifier指定组件的id即可,也可以使用@Primary首选项来指定(配置在配置类的方法上);
      • 可以添加参数required来表明当在容器中找不到这个对象时怎么处理;
      • 这个功能还可以通过Java标准的注解:@Resource(默认按照字段名称装配的)和@Inject(需要导入jar,除了required外和AutoWired一样)来实现;
      • 可以标注在字段上,字段的setter方法上,构造方法上;当标注在构造方法上,如果构造方法的参数在容器中有,那么就自动从容器中获取;
    • @Profile
      • 老的项目中一般解决项目的多套配置一般都是使用Maven的Profile配置来解决,而Maven的Profile是基于配置文件的,在使用了全注解的情况下,Spring的Profile就登场了;
      • 用法这里简单说一下,我把这里的Profile分为两种,一种就是不同的环境使用不同的Bean,如数据源的不同,另外一种就是使用不同参数配置,如端口;当然你也可以把前者使用后者实现:
        1. 对于使用不同的Bean,可以这样做:假如创建三种配置的数据源,当然这些数据源都在一个配置类中,每个@Bean配置一个数据源,在每个@Bean的方法上添加@Profile,参数就是这个Profile的名字,类似于Maven中Profile的dev/beta/online,注意的是,添加了@Profile之后,只有是 default的Bean才会被注入注册到容器中,而且加了环境标识的Bean只有这个环境被激活的时候才会被注册到容器中;问题是如何切换环境的激活状态:
          • 运行参数:(通用的方式)
            • Java虚拟机参数:-Dspring.profiles.active=<active-profile-name>
            • Program arguments(java -jar运行的时候):--spring.profiles.active=<active-profile-name>
          • 代码的方式实现,如下:
            //1、获取applicationContext
            AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
            //2、设置激活的环境
            ctx.getEnvironment().setActiveProfiles("development");
            //3、注册配置类
            ctx.register(<come-config-class>.class);
            //4、刷新容器
            ctx.refresh();
            
          • 仔细想想,这个功能之前的一个注解@Conditional能不能实现呢?☺
        2. 对于不同的配置参数,可以创建不同的配置文件,如:application-<env-name>.properties/yml:
          • 在配置文件中使用spring.profiles.active=<env-name>来指定当前使用的环境配置;
          • 而且使用yml文件的话,还可以在一个配置文件中利用yml的文档块来配置多个环境,三个英文的-就把文档分为两个文档块,具体摆渡一下就知道了,如:
            server:
              port: 8081
            spring:
              profiles:
                active: prod # 要使用的环境名称
            ---
            server:
              port: 8082
            spring:
              profiles: dev
            ---
            server:
              port: 8083
            spring:
              profiles: prod
            
    • AOP相关,参数就是AspectJ表达式,每个方法都可以添加一个参数:JoinPoint(必须作为第一个参数)来查看目标方法的信息,如方法名,参数等:
      • @Before
      • @After:正常异常完成后调用
      • @AfterReturning:目标方法正常返回,在这个方法上可以添加参数来接收目标方法的返回值,并且在这个注解的参数中使用returning指定这个参数的名称;
      • @AfterThrowing:异常繁盛就会调用这个方法,同样可以使用throwing来接收目标方法的异常对象信息;
      • @Around
      • @Pointcut:用来指定公共的切入点表达式,上面的注解的参数就像调用方法一样调用这个注解标注的方法,每个上面也可以有自己的切入点表达式;
      • @Aspect:表明标注的类是一个切面类,这个切面类里面的方法标注上面的注解;
      • @EnableAspectJAutoProxy:相当于在配置文件中的开启基于注解的配置文件<aop:aspectj-autoprocy />
    • 声明式事务:
      • @Transactional:Service的实现方法上添加
      • @EnableTransactionManagement:相当于在配置文件中开启配置式的事务<tx:annotation-driven />
      • 向容器中注入一个DataSourceTransactionManager
  2. SpringMVC注解,参考
    • 常见注解
      • @Controller
      • @ResponseBody
      • @RestController
      • @ModelAttribute
      • @SessionAttributes
      • @requestParam
      • @RequestHeader
      • @CookieValue
      • @PathVariable
      • @Component
      • @Repository
    • SpringMVC的整合
      • 编写一个继承于AbstractAnnotationConfigDispatcherServletInitializer的初始化器,重写三个方法:
        ✔ getRootConfigClasses:用于返回包含Spring的配置类的数组,形成Spring的一个父容器;
        ✔ getServletConfigClasses:用于返回包含SpringMVC配置类的数组,形成Spring的一个子容器;
        ✔ getServletMappings:用于返回包含Spring的拦截请求信息的数组,类似于web.xml中配置的url-pattern中的内容;
      • 创建两个配置类:ApplicationContextConfig.java和SpringMVCConfig.java
        ✔ Spring配置类:添加注解@ComponentScan
        @ComponentScan(value = "org.shreker.web", excludeFilters = {
            @Filter(type = FilterType.ANNOTATION, classes={Controller.class})
        })
        
        ✔ SpringMVC配置类:添加注解@ComponentScan,注意:在include的时候一定要禁用默认的过滤规则,否则无效
        @ComponentScan(value = "org.shreker.web", includeFilters = {
            @Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
        }, useDefaultFilters = false)
        
      • 其他的配置,参考官网文档
        ✔ 在SpringMVC的配置类上添加注解:@EnableWebMvc,即开启SpringMVC的其他配置,类比于配置文件中的<mvc:annotation-driven />;
        ✔ 让SpringMVC的配置类继承WebMvcConfigurerAdapter(当然你也可以实现接口WebMvcConfigurer);在这些方法中,有各种配置的方法,根据需要实现即可,实现也特比诶简单,只需要研究传递进来的参数即可;
  3. 原生JavaWeb注解
    • @WebServlet
    • @WebFilter
    • @WebInitParam
    • @WebListener
    • @MultipartConfig
    • 以上的注解都是servlet 3.0(不需要web.xml)模块的,其他的请移步到jcp网站了解(右上角搜索servlet 3.0,就会导航到标准的下载页面下载查看即可)

相关文章

  • spring注解,看这一篇就可以了

    spring提供了一系列注解,有很多作用,此处对spring核心包注解和部分常用注解做归纳和总结。 @Config...

  • Java注解小总结

    背景 最近想做Spring Boot的总结,众所周知,Spring有不少自己的注解,Spring Boot更甚,它...

  • Java注解小解

    背景 最近想做Spring Boot的总结,众所周知,Spring有不少自己的注解,Spring Boot更甚,它...

  • Spring注解总结

    逐渐的,在Spring的开发过程中,注解的使用越来越频繁,之前一直不喜欢注解,因为个人觉得可读性不好,但是正是这个...

  • Spring注解总结

    1.缓存 Spring Cache是作用在方法上的,核心思想:调用缓存方法时,把该方法参数和返回结果作为键值对存放...

  • spring02

    Spring相关注解 Spring注解开发 集成Spring测试框架 重点:重点掌握Spring相关注解。@Con...

  • Spring&&SpringMVC|注解篇

    Spring 常用注解总结 @Autowired :@autowired 自动装配,作用:为了消除java代码中的...

  • Spring系列常用注解

    附录史上最全Spring注解Spring常用注解Springboot常用45注解Springboot常用27个注解...

  • 40 个 SpringBoot 常用注解:让生产力爆表

    一、Spring Web MVC 与 Spring Bean 注解 Spring Web MVC 注解 @Requ...

  • Spring注解(Annotations)书目录

    Spring注解(Annotations) Spring注解(Annotations)之@Service Spri...

网友评论

      本文标题:Spring注解总结

      本文链接:https://www.haomeiwen.com/subject/vzanaftx.html