Spring——注解

什么是基于Java的Spring注解配置? 給一些注解的例子.

  • 基于Java的配置器钟,允許你在少量的Java注解的幫助下锯茄,進(jìn)行你的大部分Spring配置而非通過(guò)XML文件宫仗。
  • 以@Configuration 注解為例,它用來(lái)標(biāo)記類可以當(dāng)做一個(gè)bean的定義,被Spring IOC容器使用梳杏。另一個(gè)例子是@Bean注解,它表示此方法將要返回一個(gè)對(duì)象,作為一個(gè)bean注冊(cè)進(jìn)Spring應(yīng)用上下文拍鲤。

怎樣開(kāi)啟注解裝配?

注解裝配在默認(rèn)情況下是不開(kāi)啟的汞扎,為了使用注解裝配季稳,我們必須在Spring配置文件中配置 <context:annotation-config/>元素。

解釋@Required注解

  • 這個(gè)注解表明bean的屬性必須在配置的時(shí)候設(shè)置
  • 若@Required注解的bean屬性未被設(shè)置澈魄,容器將拋出BeanInitializationException景鼠。
public class EmployeeFactoryBean extends AbstractFactoryBean<Object>
{
    private String designation;

    public String getDesignation() {
        return designation;
    }

    @Required
    public void setDesignation(String designation) {
        this.designation = designation;
    }

    //more code here
}

RequiredAnnotationBeanPostProcessor是Spring中的后置處理用來(lái)驗(yàn)證被@Required 注解的bean屬性是否被正確的設(shè)置了。
在使用RequiredAnnotationBeanPostProcesso來(lái)驗(yàn)證bean屬性之前,首先要在IoC容器中對(duì)其進(jìn)行注冊(cè):
<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" />

解釋@Autowired注解

  • @Autowired注解對(duì)自動(dòng)裝配何時(shí)何處被實(shí)現(xiàn)提供了更多細(xì)粒度的控制铛漓。
  • @Autowired注解可以像@Required注解溯香、構(gòu)造器一樣被用于在bean的設(shè)值方法上自動(dòng)裝配bean的屬性,一個(gè)參數(shù)或者帶有任意名稱或帶有多個(gè)參數(shù)的方法浓恶。
  • 比如玫坛,可以在設(shè)值方法上使用@Autowired注解來(lái)替代配置文件中的元素。
    當(dāng)Spring容器在setter方法上找到@Autowired注解時(shí)包晰,會(huì)嘗試用byType 自動(dòng)裝配湿镀。
  • 當(dāng)然我們也可以在構(gòu)造方法上使用@Autowired 注解。帶有@Autowired 注解的構(gòu)造方法意味著在創(chuàng)建一個(gè)bean時(shí)將會(huì)被自動(dòng)裝配伐憾,即便在配置文件中使用元素勉痴。
public class TextEditor {
   private SpellChecker spellChecker;

   @Autowired
   public TextEditor(SpellChecker spellChecker){
      System.out.println("Inside TextEditor constructor." );
      this.spellChecker = spellChecker;
   }

   public void spellCheck(){
      spellChecker.checkSpelling();
   }
}

下面是沒(méi)有構(gòu)造參數(shù)的配置方式:

<beans>

   <context:annotation-config/>

   <!-- Definition for textEditor bean without constructor-arg  -->
   <bean id="textEditor" class="com.howtodoinjava.TextEditor">
   </bean>

   <!-- Definition for spellChecker bean -->
   <bean id="spellChecker" class="com.howtodoinjava.SpellChecker">
   </bean>

</beans>

說(shuō)明@Qualifier注解

  • 當(dāng)有多個(gè)相同類型的bean卻只有一個(gè)需要自動(dòng)裝配時(shí),將@Qualifier 注解和@Autowire 注解結(jié)合使用以消除這種混淆树肃,指定需要裝配的確切的bean蚀腿。
    下面的示例將會(huì)在Customer的person屬性中自動(dòng)裝配person的值。
public class Customer
{
    @Autowired
    private Person person;
}

下面我們要在配置文件中來(lái)配置Person類扫外。

<bean id="customer" class="com.howtodoinjava.common.Customer" />

<bean id="personA" class="com.howtodoinjava.common.Person" >
    <property name="name" value="lokesh" />
</bean>

<bean id="personB" class="com.howtodoinjava.common.Person" >
    <property name="name" value="alex" />
</bean>

Spring會(huì)知道要自動(dòng)裝配哪個(gè)person bean么?不會(huì)的莉钙,但是運(yùn)行上面的示例時(shí),會(huì)拋出下面的異常:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException:
    No unique bean of type [com.howtodoinjava.common.Person] is defined:
        expected single matching bean but found 2: [personA, personB]

要解決上面的問(wèn)題筛谚,需要使用 @Quanlifier注解來(lái)告訴Spring容器要裝配哪個(gè)bean:

public class Customer
{
    @Autowired
    @Qualifier("personA")
    private Person person;
}

一些注解

@Service用于標(biāo)注業(yè)務(wù)層組件

@Controller用于標(biāo)注控制層組件(如struts中的action)

@Repository用于標(biāo)注數(shù)據(jù)訪問(wèn)組件磁玉,即DAO組件

@Component泛指組件,當(dāng)組件不好歸類的時(shí)候驾讲,我們可以使用這個(gè)注解進(jìn)行標(biāo)注蚊伞。

component-scan標(biāo)簽

component-scan標(biāo)簽?zāi)J(rèn)情況下自動(dòng)掃描指定路徑下的包(含所有子包),將帶有@Component吮铭、@Repository时迫、@Service、@Controller標(biāo)簽的類自動(dòng)注冊(cè)到spring容器谓晌。對(duì)標(biāo)記了 Spring's @Required掠拳、@Autowired、JSR250's @PostConstruct纸肉、@PreDestroy溺欧、@Resource、JAX-WS's @WebServiceRef柏肪、EJB3's @EJB姐刁、JPA's @PersistenceContext、@PersistenceUnit等注解的類進(jìn)行對(duì)應(yīng)的操作使注解生效(包含了annotation-config標(biāo)簽的作用)

注解大全

Spring項(xiàng)目中會(huì)用到大量的注解烦味,這里羅列以下常用的聂使。除過(guò)這些外SpringBoot、SpringSecurity、SpringData等也有大量的注解
原地址:
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/package-summary.html
(1)Context org.springframework.context.annotation
@Configuration
@ComponentScan
@ComponentScans
@Conditional
@Bean
@Lazy
@DependsOn
@Import
@ImportResource
@Primary
@Profile
@Scope
@Description
@PropertySource
@PropertySources
@Role

(2)Bean org.springframework.beans.factory.annotation
@Autowired
@Qualifier
@Required
@Scope
@Lookup
@Value
@Configurable

(3)Core org.springframework.core.annotation
@Order
@AliasFor

(4)Stereotyping org.springframework.stereotype
@Component
@Controller
@Service
@Repository

(5)Web org.springframework.web.bind.annotation
@Controller
@ControllerAdvice
@InitBinder
@ModelAttribute
@MatrixVariable
@RequestMapping
@RequestParam
@RequestPart
@RequestBody
@RequestHeader
@RequestAttribute
@SessionAttribute
@SessionAttributes
@CookieValue
@ExceptionHandler
@CrossOrigin

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

@RestController
@RestControllerAdvice
@ResponseBody
@ResponseStatus
@PathVariable

(6)Transaction org.springframework.transaction.annotation
@EnableTransactionManagement
@Transactional

(7)Cache org.springframework.cache.annotation
@EnableCaching
@CacheConfig
@Cacheable
@Caching
@CachePut
@CacheEvict

(8)Schedule org.springframework.scheduling.annotation
@EnableAsync
@Async
@EnableScheduling
@Scheduled
@Schedules

(9)Aspect org.aspectj.lang.annotation
@Aspect
@After
@AfterReturning
@AfterThrowing
@Around
@Before
@DeclareParents
@Pointcut

(10)JSR-250 javax.annotation
@PostConstruct
@PreDestroy
@Resource

(11)JSR-330 javax.inject
@Inject
@Named

(12)JSR-303 javax.validation.constraints
@Max
@Min
@NotNull
@Size
@Pattern
@Valid

Hibernate Validator org.hibernate.validator.constraints
@Email
@Length
@Digits
@NotEmpty
@NotBlank
@Range
@URL
@Past
@Future

(13)MyBatis org.apache.ibatis.annotations
@Param
@Select
@Update
@Delete
@Insert
@Results
@Result
@Options

(14)其他
@EnableWebMvc org.springframework.web.servlet.config.annotation
@Validated org.springframework.validation.annotation
@MapperScan org.mybatis.spring.annotation
@Alias org.apache.ibatis.type.Alias

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末柏靶,一起剝皮案震驚了整個(gè)濱河市弃理,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宿礁,老刑警劉巖案铺,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔬芥,死亡現(xiàn)場(chǎng)離奇詭異梆靖,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)笔诵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門返吻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人乎婿,你說(shuō)我怎么就攤上這事测僵。” “怎么了谢翎?”我有些...
    開(kāi)封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵捍靠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我森逮,道長(zhǎng)榨婆,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任褒侧,我火速辦了婚禮良风,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘闷供。我一直安慰自己烟央,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布歪脏。 她就那樣靜靜地躺著疑俭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪婿失。 梳的紋絲不亂的頭發(fā)上怠硼,一...
    開(kāi)封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音移怯,去河邊找鬼香璃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛舟误,可吹牛的內(nèi)容都是我干的葡秒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼眯牧!你這毒婦竟也來(lái)了蹋岩?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤学少,失蹤者是張志新(化名)和其女友劉穎剪个,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體版确,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扣囊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绒疗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侵歇。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吓蘑,靈堂內(nèi)的尸體忽然破棺而出惕虑,到底是詐尸還是另有隱情,我是刑警寧澤磨镶,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布溃蔫,位于F島的核電站,受9級(jí)特大地震影響琳猫,放射性物質(zhì)發(fā)生泄漏伟叛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一沸移、第九天 我趴在偏房一處隱蔽的房頂上張望痪伦。 院中可真熱鬧,春花似錦雹锣、人聲如沸网沾。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)辉哥。三九已至,卻和暖如春攒射,著一層夾襖步出監(jiān)牢的瞬間醋旦,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工会放, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饲齐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓咧最,卻偏偏與公主長(zhǎng)得像捂人,于是被迫代替她去往敵國(guó)和親御雕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理滥搭,服務(wù)發(fā)現(xiàn)酸纲,斷路器,智...
    卡卡羅2017閱讀 134,699評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,848評(píng)論 6 342
  • 采用注解的優(yōu)勢(shì): 注解可以充分利用 Java 的反射機(jī)制獲取類結(jié)構(gòu)信息瑟匆,這些信息可以有效減少配置的工作闽坡。如使用 J...
    Dl_毛良偉閱讀 3,974評(píng)論 0 9
  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan閱讀 4,168評(píng)論 2 7
  • 本章內(nèi)容: 聲明Bean 構(gòu)造器注入和Setter方法注入 裝配Bean 控制bean的創(chuàng)建和銷毀 任何一個(gè)成功的...
    謝隨安閱讀 1,647評(píng)論 0 9