Web框架-Spring-Spring注解

Java工程師知識樹 / Web框架SSM


一、注解總覽

  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
  1. SpringMVC注解
    • 常見注解
      • @Controller
      • @ResponseBody
      • @RestController
      • @ModelAttribute
      • @SessionAttributes
      • @requestParam
      • @RequestHeader
      • @CookieValue
      • @PathVariable
      • @Component
      • @Repository
    • SpringMVC的整合
      • 其他的配置
  2. 原生JavaWeb注解
    • @WebServlet
    • @WebFilter
    • @WebInitParam
    • @WebListener
    • @MultipartConfig

二、注解解釋

  1. Spring注解

    • @Configuration

      • 被該注解標注的類對應于之前配置開發(fā)的applicationContext.xml
    • @Bean

      • 被該注解標注的方法相當于之前在applicationContext.xml中的一個<bean ... />配置;
      • 返回值類型就是<bean ... />中的class屬性的值,方法名就是<bean ... />中的id屬性的值;
      • 參數(shù)中可以指定initMethod和destroyMethod方法
        ? 還有一種方式,就是我們的bean實現(xiàn)兩個接口:InitializingBean和DisposableBean即可(記得給Bean添加@Component);
        ? @PostConstruct和@PreDestroy:這兩個配置在Bean的初始化和銷毀的方法上(記得給Bean添加@Component);
        ? 接口:BeanPostProcessor,初始化前后調用定義的兩個方法(記得給Bean添加@Component);
      • 對應的Bean方法也可以添加參數(shù),但是這個參數(shù)必須能在Spring容器中唯一定位;
    • @Scope

      • 作用在配置類的方法上,用來提到<bean ... />scope屬性;
    • @Lazy

      • 作用在配置類的方法上,用來使得單例的對象也延遲加載;
    • @Conditional

      • 有條件的把標注的方法返回的對象注入到Spring容器中;需要自定義一個實現(xiàn)了Spring的Condition接口的類,添加到注解的參數(shù)即可;
    • @ComponentScan

      • 該注解主要標注在配置類上,相當于applicationContext.xml中的<context:conponent-scan ··· />;
    • @Import

      • 原生類導入
        ? 直接把一些類放在@Import的參數(shù)中,就可以把這個類導入到Spring的容器中;
      • ImportSelector
        ? 用來給打@Import的類批量的,有選擇的導入一些類到Spring的容器中;@Import參數(shù)是實現(xiàn)了ImportSelector接口的類,返回的是要注入的類的全類名字符串;
      • ImportBeanDefinitionRegistrar
        ? 手動注冊類,@Import參數(shù)是實現(xiàn)了ImportBeanDefinitionRegistrar接口的類,沒有返回值;
    • @Value

      • 用來給Bean的字段賦值
        ? 參數(shù)為字面量
        ? 參數(shù)為SpEL,用來計算:#{}
        ? 參數(shù)為${},用來獲取配置文件的值,配合@PropertySource使用;
    • @PropertySource

      • 用來加載配置文件,標注在配置類上;
    • @ConfigurationProperties

      • 用來把application.properties/yml配置文件中的屬性注入到Bean中,所以一般添加在配置類的方法上,當然也可以添加在類上;

        ? 當這個注解 @ConfigurationProperties 放在類上的時候,那么這個類就是一個實體類,一般配合 @Component 來使用,即把這個類實例化一份,并把配置文件中對應 prefix 轉配到這個實體中,然后把這個實體放入Spring容器中;

        ? 如果注解 @ConfigurationProperties 放在方法上,即把配置文件的值裝配到該方法的返回的 Bean 中,這種情況一般是是在配置類的情況下,一般配合方法的 @Bean 注解結合使用;當然了,在這種情況下,返回的 Bean 對應的類上就不需要 @Component@ConfigurationProperties來修飾了,這里需要注意一下;

        @ConfigurationProperties(prefix="<key-prefix-in-properties/yml>")

    • @AutoWired

      • 自動把容器中的對象裝載進打了該標簽的變量;先按照類型找,在按照變量名稱找,如果要指定要裝配的組件,配合使用@Qualifier指定組件的id即可,也可以使用@Primary首選項來指定(配置在配置類的方法上);
      • 可以添加參數(shù)required來表明當在容器中找不到這個對象時怎么處理;
      • 這個功能還可以通過Java標準的注解:@Resource(默認按照字段名稱裝配的)和@Inject(需要導入jar,除了required外和AutoWired一樣)來實現(xiàn);
      • 可以標注在字段上,字段的setter方法上,構造方法上;當標注在構造方法上,如果構造方法的參數(shù)在容器中有,那么就自動從容器中獲取;
    • @Profile

      • 老的項目中一般解決項目的多套配置一般都是使用Maven的Profile配置來解決,而Maven的Profile是基于配置文件的,在使用了全注解的情況下,Spring的Profile就登場了;

      • 用法這里簡單說一下,我把這里的Profile分為兩種,一種就是不同的環(huán)境使用不同的Bean,如數(shù)據(jù)源的不同,另外一種就是使用不同參數(shù)配置,如端口;當然你也可以把前者使用后者實現(xiàn):

        1. 對于使用不同的Bean,可以這樣做:假如創(chuàng)建三種配置的數(shù)據(jù)源,當然這些數(shù)據(jù)源都在一個配置類中,每個@Bean配置一個數(shù)據(jù)源,在每個@Bean的方法上添加@Profile,參數(shù)就是這個Profile的名字,類似于Maven中Profile的dev/beta/online,注意的是,添加了@Profile之后,只有是 default的Bean才會被注入注冊到容器中,而且加了環(huán)境標識的Bean只有這個環(huán)境被激活的時候才會被注冊到容器中;問題是如何切換環(huán)境的激活狀態(tài):

          • 運行參數(shù):(通用的方式)

            • Java虛擬機參數(shù):-Dspring.profiles.active=<active-profile-name>
            • Program arguments(java -jar運行的時候):--spring.profiles.active=<active-profile-name>
          • 代碼的方式實現(xiàn),如下:

            //1、獲取applicationContext
            AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
            //2、設置激活的環(huán)境
            ctx.getEnvironment().setActiveProfiles("development");
            //3、注冊配置類
            ctx.register(<come-config-class>.class);
            //4、刷新容器
            ctx.refresh();
            
          • 仔細想想,這個功能之前的一個注解@Conditional能不能實現(xiàn)呢?

        2. 對于不同的配置參數(shù),可以創(chuàng)建不同的配置文件,如:application-<env-name>.properties/yml:

          • 在配置文件中使用spring.profiles.active=<env-name>來指定當前使用的環(huán)境配置;

          • 而且使用yml文件的話,還可以在一個配置文件中利用yml的文檔塊來配置多個環(huán)境,三個英文的-就把文檔分為兩個文檔塊,具體擺渡一下就知道了,如:

            server:
              port: 8081
            spring:
              profiles:
                active: prod # 要使用的環(huán)境名稱
            ---
            server:
              port: 8082
            spring:
              profiles: dev
            ---
            server:
              port: 8083
            spring:
              profiles: prod
            
    • AOP相關,參數(shù)就是AspectJ表達式,每個方法都可以添加一個參數(shù):JoinPoint(必須作為第一個參數(shù))來查看目標方法的信息,如方法名,參數(shù)等:

      • @Before
      • @After:正常異常完成后調用
      • @AfterReturning:目標方法正常返回,在這個方法上可以添加參數(shù)來接收目標方法的返回值,并且在這個注解的參數(shù)中使用returning指定這個參數(shù)的名稱;
      • @AfterThrowing:異常繁盛就會調用這個方法,同樣可以使用throwing來接收目標方法的異常對象信息;
      • @Around
      • @Pointcut:用來指定公共的切入點表達式,上面的注解的參數(shù)就像調用方法一樣調用這個注解標注的方法,每個上面也可以有自己的切入點表達式;
      • @Aspect:表明標注的類是一個切面類,這個切面類里面的方法標注上面的注解;
      • @EnableAspectJAutoProxy:相當于在配置文件中的開啟基于注解的配置文件<aop:aspectj-autoprocy />
    • 聲明式事務:

      • @Transactional:Service的實現(xiàn)方法上添加
      • @EnableTransactionManagement:相當于在配置文件中開啟配置式的事務<tx:annotation-driven />;
      • 向容器中注入一個DataSourceTransactionManager
  2. SpringMVC注解

    • 常見注解

      • @Controller
      • @ResponseBody
      • @RestController
      • @ModelAttribute
      • @SessionAttributes
      • @requestParam
      • @RequestHeader
      • @CookieValue
      • @PathVariable
      • @Component
      • @Repository
    • SpringMVC的整合

      • 編寫一個繼承于AbstractAnnotationConfigDispatcherServletInitializer的初始化器,重寫三個方法:
        ? getRootConfigClasses:用于返回包含Spring的配置類的數(shù)組,形成Spring的一個父容器;
        ? getServletConfigClasses:用于返回包含SpringMVC配置類的數(shù)組,形成Spring的一個子容器;
        ? getServletMappings:用于返回包含Spring的攔截請求信息的數(shù)組,類似于web.xml中配置的url-pattern中的內容;

      • 創(chuàng)建兩個配置類:ApplicationContextConfig.java和SpringMVCConfig.java

        ? Spring配置類:添加注解@ComponentScan

        @ComponentScan(value = "org.shreker.web", excludeFilters = {
            @Filter(type = FilterType.ANNOTATION, classes={Controller.class})
        })
        

        ? SpringMVC配置類:添加注解@ComponentScan,注意:在include的時候一定要禁用默認的過濾規(guī)則,否則無效

        @ComponentScan(value = "org.shreker.web", includeFilters = {
            @Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
        }, useDefaultFilters = false)
        
      • 其他的配置
        ? 在SpringMVC的配置類上添加注解:@EnableWebMvc,即開啟SpringMVC的其他配置,類比于配置文件中的<mvc:annotation-driven />;
        ? 讓SpringMVC的配置類繼承WebMvcConfigurerAdapter(當然你也可以實現(xiàn)接口WebMvcConfigurer);在這些方法中,有各種配置的方法,根據(jù)需要實現(xiàn)即可,實現(xiàn)也特比誒簡單,只需要研究傳遞進來的參數(shù)即可;

  3. 原生JavaWeb注解

    • @WebServlet
    • @WebFilter
    • @WebInitParam
    • @WebListener
    • @MultipartConfig
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容