一、注解總覽
- Spring注解
- @Configuration
- @Bean
- @Scope
- @Lazy
- @Conditional
- @ComponentScan
- @Import
- @Value
- @PropertySource
- @ConfigurationProperties
- @AutoWired
- @Profile
AOP相關
- @Before
- @After
- @AfterReturning
- @AfterThrowing
- @Around
- @Pointcut
- @Aspect
- @EnableAspectJAutoProxy
聲明式事務
- @Transactional
- @EnableTransactionManagement
- SpringMVC注解
- 常見注解
- @Controller
- @ResponseBody
- @RestController
- @ModelAttribute
- @SessionAttributes
- @requestParam
- @RequestHeader
- @CookieValue
- @PathVariable
- @Component
- @Repository
- SpringMVC的整合
- 其他的配置
- 常見注解
- 原生JavaWeb注解
- @WebServlet
- @WebFilter
- @WebInitParam
- @WebListener
- @MultipartConfig
二、注解解釋
-
Spring注解
-
@Configuration
- 被該注解標注的類對應于之前配置開發(fā)的
applicationContext.xml
- 被該注解標注的類對應于之前配置開發(fā)的
-
@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使用;
- 用來給Bean的字段賦值
-
@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):
-
對于使用不同的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>
- Java虛擬機參數(shù):
-
代碼的方式實現(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)呢?
-
-
對于不同的配置參數(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
-
-
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ù)即可;
-
-
原生JavaWeb注解
- @WebServlet
- @WebFilter
- @WebInitParam
- @WebListener
- @MultipartConfig