最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談spring 常用注解

 更新時(shí)間:2017年11月13日 10:56:03   作者:Justnow_  
這篇文章主要介紹了淺談spring 常用注解,具有一定參考價(jià)值,需要的朋友可以了解下。

我們不妨先將spring常用的注解按照功能進(jìn)行分類

1 、將普通類加入容器形成Bean的注解

日常開發(fā)中主要使用到的定義Bean的注解包括(XML方式配置bean暫不討論):

@Component、@Repository、@Service、@Controller、@Bean

其中@Component、@Repository、@Service、@Controller實(shí)質(zhì)上屬于同一類注解,用法相同,功能相同,區(qū)別在于標(biāo)識(shí)組件的類型。當(dāng)一個(gè)組件代表數(shù)據(jù)訪問層(Dao)時(shí),你可以給它加上@Repository注解,如下例:

@Repository
public class BiliAPIDaoImpl implements BiliAPIDao {
private final static Logger LOGGER = LoggerFactory.getLogger(BiliAPIDaoImpl.class);
 
private BiliAPIHttpClient asoAPIHttpClient;
public void execute(){
  //some logic business
 }
}

當(dāng)組件用于業(yè)務(wù)層時(shí),使用@Service注解,如下例:

@Service(value="SecUserService")
public class SecUsersServiceImpl implements SecUsersService {
 @Autowired
 private SecUsersDao secUsersDao;
 @Autowired
 private SecRoleUserService secRoleUserService;
 public void doBusiness(){
  //do some business
 }
 }

注意,在此處的@Service注解中額外添加了value=”SecUserService”的屬性,為何對(duì)此一舉呢?value屬性可以指定生成后Bean的名稱,這個(gè)名稱便成為容器中bean 的唯一標(biāo)識(shí)符。同樣的,在@Component、@Repository、@Controller也均可以指定其value值,當(dāng)然,是如有必要時(shí)加

當(dāng)組件屬于控制層時(shí),則使用@Controller注解;當(dāng)組件不能進(jìn)行很好地歸類時(shí),那我們可以使用@Component注解。因使用方式均相同,故此處不再繼續(xù)貼代碼

在這幾個(gè)注解中,額外需要留意的是@Bean注解。不妨看代碼:

@Component
public class FactoryMethodComponent {
 
 private static int i;
 
 @Bean @Qualifier("public")
 public TestBean publicInstance() {
  return new TestBean("publicInstance");
 }
 
 // use of a custom qualifier and autowiring of method parameters
 
 @Bean
 protected TestBean protectedInstance(@Qualifier("public") TestBean spouse,
          @Value("#{privateInstance.age}") String country) {
  TestBean tb = new TestBean("protectedInstance", 1);
  tb.setSpouse(tb);
  tb.setCountry(country);
  return tb;
 }
 
 @Bean @Scope(BeanDefinition.SCOPE_SINGLETON)
 private TestBean privateInstance() {
  return new TestBean("privateInstance", i++);
 }
 
 @Bean @Scope(value = WebApplicationContext.SCOPE_SESSION,
    proxyMode = ScopedProxyMode.TARGET_CLASS)
 public TestBean requestScopedInstance() {
  return new TestBean("requestScopedInstance", 3);
 }
}

Bean注解主要用于方法上,有點(diǎn)類似于工廠方法,當(dāng)使用了@Bean注解,我們可以連續(xù)使用多種定義bean時(shí)用到的注解,譬如用@Qualifier注解定義工廠方法的名稱,用@Scope注解定義該bean的作用域范圍,譬如是singleton還是prototype等。

此處還得另外提一個(gè)注解: @Configuration.實(shí)際上,上面談到的@Bean注解更多時(shí)候是與@Configuration注解在一起使用的。如果將一個(gè)類標(biāo)注為@Configuration注解,那么也就意味著這個(gè)class將會(huì)作為創(chuàng)建各種bean的工廠(類似于一個(gè)新的容器)。最簡(jiǎn)單的配合使用示例如下:

@Configuration
public class AppConfig {
 @Bean
 public MyService myService() {
  return new MyServiceImpl();
 }
}

以上的代碼實(shí)際上等價(jià)于Xml中的配置:

<beans>
 <bean class="com.acme.services.MyServiceImpl" id="myService">
</bean></beans>

我們還需要注意的一點(diǎn),在Spring的@Component注解中使用@Bean與在Spring中的@Configuration使用是一定的差別的。在使用@Component的類中不會(huì)強(qiáng)制使用CGLIB代理攔截方法和屬性。而在@Configuration類中,則會(huì)使用CGLIB代理去調(diào)用@Bean標(biāo)注的方法并返回對(duì)象的引用。在@Configuration注解中使用@Bean也可以防止同一個(gè)@Bean方法被意外調(diào)用多次時(shí)而產(chǎn)生細(xì)微的難以排查的錯(cuò)誤

2、從容器中取Bean(裝配bean)時(shí)常用的注解

開發(fā)中最常用到的用于裝配的注解是:@Autowired和@Resource

@Autowired注解:

public class MovieRecommender {
 
 @Autowired
 private MovieCatalog movieCatalog;
 
 private CustomerPreferenceDao customerPreferenceDao;
 
 @Autowired
 public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
  this.customerPreferenceDao = customerPreferenceDao;
 }
 
 // ...
}

@Autowired注解可用于為類的屬性、構(gòu)造器、方法進(jìn)行注值。默認(rèn)情況下,其依賴的對(duì)象必須存在(bean可用),如果需要改變這種默認(rèn)方式,可以設(shè)置其required屬性為false。另外一個(gè)比較重要的點(diǎn)就是,@Autowired注解默認(rèn)按照類型裝配,如果容器中包含多個(gè)同一類型的Bean,那么啟動(dòng)容器時(shí)會(huì)報(bào)找不到指定類型bean的異常,解決辦法是結(jié)合@Qualified注解進(jìn)行限定,指定注入的bean名稱

@Resource注解
對(duì)于@Resource注解,它并不屬于spring的注解,而是來自于JSR-250。其默認(rèn)情況下按照bean的名稱進(jìn)行注入,當(dāng)找不到匹配項(xiàng)時(shí)會(huì)按照類型裝配。當(dāng)按照名稱進(jìn)行裝配時(shí),可以指定其name屬性,倘若沒有指定,注解標(biāo)注在哪個(gè)字段上,其默認(rèn)名稱就是那個(gè)字段的名稱。當(dāng)然,@Resource注解也支持按指定類型進(jìn)行裝配,給它的type屬性賦特定類型的值即可(注意,當(dāng)指定了name屬性后,只能按照名稱裝配)

public class SpringAnotationDemo {
 
 @Bean
 @Qualifier("httpApiClient")
 public HttpApiClient createHttpClient() {
  return new HttpApiClient();
 }
 
 @Resource(name = "httpApiClient")
 private HttpApiClient httpApiClient;
 @Resource(type = XQSmsHttpClient.class)
 private SmsHttpClient smsHttpClient;
}

依我個(gè)人理解,其實(shí)@Resource要比@Autowired好用得多,@Resource注解的使用性更為靈活,可指定名稱,也可以指定類型 ,而用@Autowired注解進(jìn)行裝配容易拋出異常,特別是裝配的bean類型有多個(gè)的時(shí)候,而解決的辦法是需要在增加@Qualitied進(jìn)行限定

vc模塊注解">3、spring MVC模塊注解
web模塊常用到的注解包括:

@Controller、@RequestMapping、@RequestParam、@PathVariable

@Controller
將一個(gè)類加上@Controller注解后,表明該類會(huì)作為與前端作交互的控制層組件

@Controller
public class CompanyController {
/**this class will be the controller component of container**/
...
}

@RequestMapping
這個(gè)注解用于將url映射到整個(gè)處理類或者特定的處理請(qǐng)求的方法

@Controller
@RequestMapping("/company")
public class CompanyController {
 
 @Autowired
 private CompanyService companyService;
...
}

如上例,當(dāng)標(biāo)注在class上時(shí),表明此類會(huì)接收url為”/company”請(qǐng)求

@RequestParam
用于綁定request請(qǐng)求參數(shù)到指定的方法

@Controller
@RequestMapping("/company")
public class CompanyController {
 
 @Autowired
 private CompanyService companyService;
 
 @RequestMapping("/companyList")
 public String listCompanies(Map<string, object=""> map, 
    @RequestParam(value = "data", required = false) String data,
    @RequestParam(value = "phone_num", required = true) String phoneNum) {
 map.put("data", data);
 map.put("phoneNum", phoneNum);
 return "companyList";
 }
...
}

譬如上例中,@RequestParam請(qǐng)求參數(shù)指定了傳入?yún)?shù)的具體字段名(value指定的),以及是否必須傳的字段(默認(rèn)情況下,required=true)。data,phoneNum為形參,即請(qǐng)求參數(shù)的使用名,可以更改

@PathVariable
該注解用于方法修飾方法參數(shù),會(huì)將修飾的方法參數(shù)變?yōu)榭晒┦褂玫膗ri變量(可用于動(dòng)態(tài)綁定),請(qǐng)看如下栗子:

@Controller
@RequestMapping("/company")
public class CompanyController {
 
 @Autowired
 private CompanyService companyService;
 
 @RequestMapping("{companyName}")
 public String getCompany(Map<string, object=""> map, 
   @PathVariable String companyName) {
 Company company = companyService.findByName(companyName);
 map.put("company", company);
 return "company";
 }
...
}

當(dāng)我們請(qǐng)求 “/compony/account”時(shí),componyName會(huì)動(dòng)態(tài)地綁定為”account”

4、事務(wù)模塊注解@Transactional

在處理dao層或service層的事務(wù)操作時(shí),譬如刪除失敗時(shí)的回滾操作,可用到@Transactional注解,如下例:

@Service
public class CompanyServiceImpl implements CompanyService {
 @Autowired
 private CompanyDAO companyDAO;
 
 @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = Exception.class)
 public int deleteByName(String name) {
 
 int result = companyDAO.deleteByName(name);
 return company;
 }
 ...
}

上例表明,執(zhí)行deleteByName方法時(shí),啟用了事務(wù)處理,事務(wù)的各屬性含義如下:

propagation
事務(wù)的傳播行為,spring在TransactionDefinition接口中規(guī)定了7種類型的事務(wù)傳播行為,它們規(guī)定了事務(wù)方法和事務(wù)方法發(fā)生嵌套調(diào)用時(shí)如何進(jìn)行傳播:

事務(wù)傳播行為類型 描述
PROPAGATION_REQUIRED 如果當(dāng)前沒有事務(wù),就新建一個(gè)事務(wù),如果已經(jīng)存在一個(gè)事務(wù)中,加入到這個(gè)事務(wù)中。這是最常見的選擇。
PROPAGATION_SUPPORTS 支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就以非事務(wù)方式執(zhí)行。
PROPAGATION_MANDATORY 使用當(dāng)前的事務(wù),如果當(dāng)前沒有事務(wù),就拋出異常。
PROPAGATION_REQUIRES_NEW 新建事務(wù),如果當(dāng)前存在事務(wù),把當(dāng)前事務(wù)掛起。
PROPAGATION_NOT_SUPPORTED 以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起。
PROPAGATION_NEVER 以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常
PROPAGATION_NESTED 如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行。如果當(dāng)前沒有事務(wù),則執(zhí)行與PROPAGATION_REQUIRED類 似的操作

注:第一種是最常用的,默認(rèn)的

readOnly
事務(wù)的讀寫屬性,取true或者false,true為只讀、默認(rèn)為false rollbackFor
回滾策略,當(dāng)遇到指定異常時(shí)回滾。譬如上例遇到異常就回滾 timeout (補(bǔ)充的)
設(shè)置超時(shí)時(shí)間,單位為秒 isolation
設(shè)置事務(wù)隔離級(jí)別,枚舉類型,一共五種

類型 描述
DEFAULT 采用數(shù)據(jù)庫(kù)默認(rèn)隔離級(jí)別
READ_UNCOMMITTED 讀未提交的數(shù)據(jù)(會(huì)出現(xiàn)臟讀?。?/td>
READ_COMMITTED 讀已提交的數(shù)據(jù)(會(huì)出現(xiàn)幻讀,即前后兩次讀的不一樣)
REPEATABLE_READ 可重復(fù)讀,會(huì)出現(xiàn)幻讀
SERIALIZABLE 串行化(對(duì)資源消耗較大,一般不使用)

5、 Spring AOP模塊注解
spring aop模塊的注解主要有@Aspect、@Pointcut、@Before、@Around、@After、
@AfterReturning、@AfterThrowing

@Aspect
標(biāo)明該類為切面類,并啟用AspectJ注解,注:在使用時(shí)要同@Component一起使用,否則不會(huì)被掃描到加入容器

@Pointcut
定義切入點(diǎn),關(guān)于切入點(diǎn)表達(dá)式書寫方式,請(qǐng)移步官方文檔:spring AOP文檔

@Around
定義環(huán)繞通知,在目標(biāo)方法執(zhí)行前后嵌入相關(guān)業(yè)務(wù)邏輯

@Before
定義前置通知,在目標(biāo)方法執(zhí)行前執(zhí)行

@After
定義后置通知,在目標(biāo)方法執(zhí)行后執(zhí)行,不論是目標(biāo)方法執(zhí)行正常后退出,還是拋出異常后退出,均會(huì)被執(zhí)行

@AfterReturning
目標(biāo)方法執(zhí)行正常退出后執(zhí)行 @AfterThrowing
目標(biāo)方法執(zhí)行拋出異常后執(zhí)行

總結(jié)

以上就是本文關(guān)于淺談spring 常用注解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱:

Java之Spring注解配置bean實(shí)例代碼解析

淺談Java注解和動(dòng)態(tài)代理

有什么問題可以隨時(shí)留言,小編會(huì)及時(shí)回復(fù)大家的。感謝朋友們對(duì)本站的支持!

相關(guān)文章

  • 淺談java是如何做資源回收補(bǔ)救的

    淺談java是如何做資源回收補(bǔ)救的

    這篇文章主要介紹了淺談java是如何做資源回收補(bǔ)救的,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • java中jdbcTemplate的queryForList(坑)

    java中jdbcTemplate的queryForList(坑)

    本文主要介紹了java中jdbcTemplate的queryForList,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 教你如何用Java根據(jù)日期生成流水號(hào)

    教你如何用Java根據(jù)日期生成流水號(hào)

    這篇文章主要介紹了教你如何用Java根據(jù)日期生成流水號(hào),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • java中File類的構(gòu)造函數(shù)及其方法

    java中File類的構(gòu)造函數(shù)及其方法

    這篇文章主要介紹了java中File類的構(gòu)造函數(shù)及其方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-06-06
  • Java項(xiàng)目中如何引入Hutool工具類并正確使用它

    Java項(xiàng)目中如何引入Hutool工具類并正確使用它

    Hutool是一個(gè)小而全的Java工具類庫(kù),通過靜態(tài)方法封裝,降低相關(guān)API的學(xué)習(xí)成本,提高工作效率,使Java擁有函數(shù)式語(yǔ)言般的優(yōu)雅,這篇文章主要給大家介紹了關(guān)于Java項(xiàng)目中如何引入Hutool工具類并正確使用它的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • struts+spring+hibernate三個(gè)框架的整合

    struts+spring+hibernate三個(gè)框架的整合

    這篇文章主要介紹了struts+spring+hibernate三個(gè)框架的整合,需要的朋友可以參考下
    2017-09-09
  • Java中IP段轉(zhuǎn)CIDR的原理與實(shí)現(xiàn)詳解

    Java中IP段轉(zhuǎn)CIDR的原理與實(shí)現(xiàn)詳解

    CIDR表示的是無類別域間路由,通常形式是IP地址后跟一個(gè)斜杠和數(shù)字,這篇文章主要為大家介紹了如何使用Java實(shí)現(xiàn)IP段轉(zhuǎn)CIDR,需要的可以了解下
    2025-03-03
  • 在SpringBoot中使用@Value注解來設(shè)置默認(rèn)值的方法

    在SpringBoot中使用@Value注解來設(shè)置默認(rèn)值的方法

    Spring Boot提供了一種使用注解設(shè)置默認(rèn)值的方式,即使用 @Value 注解,下面這篇文章主要給大家介紹了關(guān)于如何在SpringBoot中使用@Value注解來設(shè)置默認(rèn)值的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • 淺談Spring Cloud Netflix-Ribbon灰度方案之Zuul網(wǎng)關(guān)灰度

    淺談Spring Cloud Netflix-Ribbon灰度方案之Zuul網(wǎng)關(guān)灰度

    這篇文章主要介紹了淺談Spring Cloud Netflix-Ribbon灰度方案之Zuul網(wǎng)關(guān)灰度,想了解Ribbon灰度的同學(xué)可以參考下
    2021-04-04
  • Java CompletableFuture如何實(shí)現(xiàn)超時(shí)功能

    Java CompletableFuture如何實(shí)現(xiàn)超時(shí)功能

    這篇文章主要為大家介紹了實(shí)現(xiàn)超時(shí)功能的基本思路以及CompletableFuture(之后簡(jiǎn)稱CF)是如何通過代碼實(shí)現(xiàn)超時(shí)功能的,需要的小伙伴可以了解下
    2025-01-01

最新評(píng)論

台中县| 城步| 永安市| 大理市| 五台县| 曲沃县| 凤阳县| 环江| 环江| 中超| 大理市| 砀山县| 高尔夫| 凤台县| 沈阳市| 伊吾县| 巴中市| 晋城| 三门县| 淳化县| 仁化县| 双鸭山市| 汤原县| 木兰县| 宕昌县| 安化县| 武川县| 方城县| 乌鲁木齐县| 泸西县| 搜索| 平罗县| 华蓥市| 娄底市| 山西省| 新野县| 鱼台县| 唐河县| 肃宁县| 淳安县| 富蕴县|