spring 相關(guān)注解(1)@Configuration @Value @Scope @Controller, @Service, @Repository, @Component @PostCo...

1.@Configuration注解

該類等價與XML中配置的beans,相當(dāng)于IOC容器,它的某個方法的頭上如果用了@Bean,則它會作為Spring容器中的bean,與XML配置的bean功能相同
@Configuration注解的類必須使用<context:component-scanbase-package="XXX"/>掃描。如下:

@Configuration
public class ScheduleConfig {
  
    //讀取配置文件的值
    @Value("${vschedule.port}")
    private Integer port;

    @Bean
    public JobNode jobNodeConfig() {
        JobNode node = new JobNode();
        node.setDoJobServicePort(port);
        node.setAppName("feedback-service");
        return node;
    }
}

定義一個ScheduleConfig ,用@Configuration注解,那ScheduleConfig 相當(dāng)于xml里的beans,里面用@Bean注解的和xml里定義的bean等價,用<context:component-scanbase-package=”XXX”/>掃描該類所在的包,最終我們可以在程序里用@AutoWired或@Resource注解取得用@Bean注解的bean,和用xml先配置bean然后在程序里自動注入一樣。目的是減少xml里配置

2.@Value注解

為了簡化配置文件里取值,可以使用此注解@Value獲取配置文件里的值,在spring項(xiàng)目中可以在XML文件中引入文件:

<context:property-placeholder location="classpath*:props/schedule.properties" ignore-unresolvable="true"/>

讀取方法為:

    //讀取配置文件的值
    @Value("${vschedule.port}")
    private Integer port;

即使給變量賦了初值也會以配置文件的值為準(zhǔn)。

3. 用在類上的注解@Controller, @Service, @Repository, @Component

在Spring2.0之前的版本中,@Repository注解可以標(biāo)記在任何的類上,用來表明該類是用來執(zhí)行與數(shù)據(jù)庫相關(guān)的操作(即dao對象),并支持自動處理數(shù)據(jù)庫操作產(chǎn)生的異常

在Spring2.5版本中,引入了更多的Spring類注解:@Component,@Service,@Controller。@Component是一個通用的Spring容器管理的單例bean組件。而@Repository, @Service, @Controller就是針對不同的使用場景所采取的特定功能化的注解組件。

因此,當(dāng)你的一個類被@Component所注解,那么就意味著同樣可以用@Repository, @Service, @Controller來替代它,同時這些注解會具備有更多的功能,而且功能各異。

最后,如果你不知道要在項(xiàng)目的業(yè)務(wù)層采用@Service還是@Component注解。那么,@Service是一個更好的選擇。

@Controller對應(yīng)表現(xiàn)層上的Bean,也就是Action,例如:

@Controller
public class TeacherCommentController {
  ......
}

@Service對應(yīng)業(yè)務(wù)層Bean,例如:

@Service
@Scope("prototype")
public class RecommendCourseServiceImpl implements RecommendCourseService {
    .....
}

@Scope
注:@Scope("prototype")表示將Action的范圍聲明為原型,可以利用容器的scope="prototype"來保證每一個請求有一個單獨(dú)的Action來處理,避免struts中Action的線程安全問題。spring 默認(rèn)scope 是單例模式(scope="singleton"),這樣只會創(chuàng)建一個Action對象,每次訪問都是同一Action對象,數(shù)據(jù)不安全,struts2 是要求每次次訪問都對應(yīng)不同的Action,scope="prototype" 可以保證當(dāng)有請求的時候都創(chuàng)建一個Action對象

@Repository一般針對數(shù)據(jù)處理層即dao層,例如:

@Repository
public interface TeacherCommentDao{

    public List<TeacherComment> findByTeacherIdAndTimeRange(Map condition);
    .......
}

其他網(wǎng)上資料

這幾個注解幾乎可以說是一樣的:因?yàn)楸贿@些注解修飾的類就會被Spring掃描到并注入到Spring的bean容器中。

這里,有兩個注解是不能被其他注解所互換的:

@Controller 注解的bean會被spring-mvc框架所使用。
@Repository 會被作為持久層操作(數(shù)據(jù)庫)的bean來使用
如果想使用自定義的組件注解,那么只要在你定義的新注解中加上@Component即可:

@Component 
@Scope("prototype")
public @interface ScheduleJob {...}

這樣,所有被@ScheduleJob注解的類就都可以注入到spring容器來進(jìn)行管理。我們所需要做的,就是寫一些新的代碼來處理這個自定義注解(譯者注:可以用反射的方法),進(jìn)而執(zhí)行我們想要執(zhí)行的工作。

@Component就是跟<bean>一樣,可以托管到Spring容器進(jìn)行管理。

@Service, @Controller , @Repository = {@Component + 一些特定的功能}。這個就意味著這些注解在部分功能上是一樣的。

當(dāng)然,下面三個注解被用于為我們的應(yīng)用進(jìn)行分層:

@Controller注解類進(jìn)行前端請求的處理,轉(zhuǎn)發(fā),重定向。包括調(diào)用Service層的方法
@Service注解類處理業(yè)務(wù)邏輯
@Repository注解類作為DAO對象(數(shù)據(jù)訪問對象,Data Access Objects),這些類可以直接對數(shù)據(jù)庫進(jìn)行操作
有這些分層操作的話,代碼之間就實(shí)現(xiàn)了松耦合,代碼之間的調(diào)用也清晰明朗,便于項(xiàng)目的管理;假想一下,如果只用@Controller注解,那么所有的請求轉(zhuǎn)發(fā),業(yè)務(wù)處理,數(shù)據(jù)庫操作代碼都糅合在一個地方,那這樣的代碼該有多難拓展和維護(hù)。

總結(jié)

@Component, @Service, @Controller, @Repository是spring注解,注解后可以被spring框架所掃描并注入到spring容器來進(jìn)行管理
@Component是通用注解,其他三個注解是這個注解的拓展,并且具有了特定的功能
@Repository注解在持久層中,具有將數(shù)據(jù)庫操作拋出的原生異常翻譯轉(zhuǎn)化為spring的持久層異常的功能。
@Controller層是spring-mvc的注解,具有將請求進(jìn)行轉(zhuǎn)發(fā),重定向的功能。
@Service層是業(yè)務(wù)邏輯層注解,這個注解只是標(biāo)注該類處于業(yè)務(wù)邏輯層。
用這些注解對應(yīng)用進(jìn)行分層之后,就能將請求處理,義務(wù)邏輯處理,數(shù)據(jù)庫操作處理分離出來,為代碼解耦,也方便了以后項(xiàng)目的維護(hù)和開發(fā)。

注解 含義
@Component 最普通的組件,可以被注入到spring容器進(jìn)行管理
@Repository 作用于持久層
@Service 作用于業(yè)務(wù)邏輯層
@Controller 作用于表現(xiàn)層(spring-mvc的注解)

4. @PostConstruct 和 @PreDestory

實(shí)現(xiàn)初始化和銷毀bean之前進(jìn)行的操作,只能有一個方法可以用此注釋進(jìn)行注釋,方法不能有參數(shù),返回值必需是void,方法需要是非靜態(tài)的。

@PostConstruct:在構(gòu)造方法和init方法(如果有的話)之間得到調(diào)用,且只會執(zhí)行一次。

@PreDestory:注解的方法在destory()方法調(diào)用后得到執(zhí)行。


圖片.png

5. @Primary

自動裝配時當(dāng)出現(xiàn)多個Bean候選者時,被注解為@Primary的Bean將作為首選者,否則將拋出異常。

6. @Lazy(true)

用于指定該Bean是否取消預(yù)初始化,用于注解類,延遲初始化。

6. @Autowired 和 @Resource

1、@Autowired與@Resource都可以用來裝配bean. 都可以寫在字段上,或?qū)懺趕etter方法上。

2、@Autowired默認(rèn)按類型裝配(這個注解是屬于spring的),默認(rèn)情況下必須要求依賴對象必須存在,如果要允許null值,可以設(shè)置它的required屬性為false,如:
@Autowired(required=false) ,如果我們想使用名稱裝配可以結(jié)合@Qualifier注解進(jìn)行使用,如下:
Java代碼

@Autowired() @Qualifier("baseDao")
private BaseDao baseDao;

3、@Resource 是JDK1.6支持的注解,默認(rèn)按照名稱進(jìn)行裝配,名稱可以通過name屬性進(jìn)行指定,如果沒有指定name屬性,當(dāng)注解寫在字段上時,默認(rèn)取字段名,按照名稱查找,如果注解寫在setter方法上默認(rèn)取屬性名進(jìn)行裝配。當(dāng)找不到與名稱匹配的bean時才按照類型進(jìn)行裝配。但是需要注意的是,如果name屬性一旦指定,就只會按照名稱進(jìn)行裝配。

兩者的區(qū)別:
@Resource默認(rèn)按照名稱方式進(jìn)行bean匹配,@Autowired默認(rèn)按照類型方式進(jìn)行bean匹配
@Resource(import javax.annotation.Resource;)是J2EE的注解,@Autowired( import org.springframework.beans.factory.annotation.Autowired;)是Spring的注解

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

相關(guān)閱讀更多精彩內(nèi)容

  • 1.1 spring IoC容器和beans的簡介 Spring 框架的最核心基礎(chǔ)的功能是IoC(控制反轉(zhuǎn))容器,...
    simoscode閱讀 6,852評論 2 22
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,659評論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,282評論 6 342
  • 內(nèi)容過長,core部分分開發(fā)布,core章節(jié)第二部分點(diǎn)擊:Spring Framework 官方文檔中文版—Cor...
    kopshome閱讀 34,357評論 7 24
  • 轉(zhuǎn) Spring****基于 Annotation 的簡單介紹 2011年03月29日 15:07:00 閱讀數(shù):...
    fd649cf896c0閱讀 380評論 1 0

友情鏈接更多精彩內(nèi)容