Spring註解標籤詳解@Autowired @Qualifier等 @Slf4j

 @Slf4j @Slf4j註解實現日誌輸出

 

 

 

本身寫日誌的時候,確定須要:html

private final Logger logger = LoggerFactory.getLogger(LoggerTest.class);
1
每次寫新的類,就須要從新寫logger
有簡單的方式,就是使用@Slf4j註解java

首先是在pom中引入:spring

<!--能夠引入日誌 @Slf4j註解-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
1
2
3
4
5
而後在類上寫上@Slf4j註解
在方法中直接使用 app


若是註解@Slf4j注入後找不到變量log,須要IDEA安裝lombok插件,函數

File → settings → Plugins
如圖 測試


安裝完成後重啓便可ui

package cn.chenhaoxiang;this

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import lombok.extern.slf4j.XSlf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;spa

/**
* Created with IntelliJ IDEA.
* User: 陳浩翔.
* Date: 2018/1/8.
* Time: 下午 8:05.
* Explain:日誌測試
*/插件

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class LoggerTest {
private final Logger logger = LoggerFactory.getLogger(LoggerTest.class);

/**
* 傳統方式實現日誌
*/
@Test
public void test1(){
logger.debug("debug");//默認日誌級別爲info
logger.info("info");
logger.error("error");
logger.warn("warn");
}

/**
* Slf4j註解方式實現日誌
*/
@Test
public void test2(){
log.debug("debug");//默認日誌級別爲info
log.info("info");
log.error("error");
log.warn("warn");
}

@Autowired

spring2.1中容許用戶經過@Autowired註解對Bean的屬性變量.屬性Setter方法以及構造函數進行標註,配合AutowiredAnnotationBeanProcessor完成Bean的自動配置。使用@Autowired註釋進行byType注入。

在applicationContext.xml中加入:

<!-- 該 BeanPostProcessor 將自動對標註 @Autowired 的 Bean 進行注入 -->
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

經過 @Autowired的使用來消除 set ,get方法。

  1.  
    @Autowired
  2.  
    private UserDao userdao;

這樣就能夠刪除set ,get方法和spring中的相關配製了。

  1.  
    <bean id="userDao" class="..."/>
  2.  
    <bean id="userService" class="...">
  3.  
    <property name="userDao">
  4.  
    <ref bean="userDao"/>
  5.  
    </property>
  6.  
    </bean>

經過@Autowired屬的Setter方法給父類中的屬性注入值。

  1.  
    @Autowired
  2.  
    public void setDataSource(DataSource dataSource)
  3.  
    {
  4.  
    super.setDataSource(dataSource);
  5.  
    }

@Autowired(required = false)

當不能肯定 Spring 容器中必定擁有某個類的 Bean 時,能夠在須要自動注入該類 Bean 的地方可使用 @Autowired(required = false) ,這等於告訴 Spring:在找不到匹配 Bean 時也不報錯。

固然,通常狀況下,使用 @Autowired 的地方都是須要注入 Bean 的,使用了自動注入而又容許不注入的狀況通常僅會在開發期或測試期碰到(如爲了快速啓動 Spring 容器,僅引入一些模塊的 Spring 配置文件),因此 @Autowired(required = false) 會不多用到。

@Qualifier

使用@Autowired註釋進行byType注入,若是須要byName(byName就是經過id去標識)注入,增長@Qualifier註釋。通常在候選Bean數目不爲1時應該加@Qualifier註釋。

在默認狀況下使用 @Autowired 註釋進行自動注入時,Spring 容器中匹配的候選 Bean 數目必須有且僅有一個。當找不到一個匹配的 Bean 時,Spring 容器將拋出

BeanCreationException 異常,並指出必須至少擁有一個匹配的 Bean。

和找不到一個類型匹配 Bean 相反的一個錯誤是:若是 Spring 容器中擁有多個候選 Bean,Spring 容器在啓動時也會拋出 BeanCreationException 異常。

Spring 容許咱們經過 @Qualifier 註釋指定注入 Bean 的名稱,這樣歧義就消除了,能夠經過下面的方法解決異常:

  1.  
    @Autowired
  2.  
    public void setOffice(@Qualifier("office")Office office)
  3.  
    {
  4.  
    this.office =office;
  5.  
    }

也能夠直接注入到屬性:

  1.  
    @Autowired
  2.  
    @Qualifier("office")
  3.  
    private Office office;

@Qualifier(「office」)中的office是Bean的名稱,因此@Autowired和@Qualifier結合使用時,自動注入的策略就從byType轉變成byName了。

@Autowired能夠對成員變量、方法以及構造函數進行註釋,而@Qualifier的標註對象是成員變量、方法入參、構造函數入參。正是因爲註釋對象的不一樣,因此Spring不將 @Autowired和@Qualifier統一成一個註釋類。

@Qualifier 只能和@Autowired 結合使用,是對@Autowired有益的補充。

通常來說,@Qualifier對方法簽名中入參進行註釋會下降代碼的可讀性,而對成員變量註釋則相對好一些。

@Resource

Spring不但支持本身定義的@Autowired註解,還支持幾個由JSR-250規範定義的註解,它們分別是@Resource、@PostConstruct以及@PreDestroy。

@Resource的做用至關於@Autowired,只不過@Autowired按byType自動注入,而@Resource默認按 byName自動注入罷了。@Resource有兩個屬性是比較重要的,分是name和type,Spring將@Resource註解的name屬性解析爲bean的名字,而type屬性則解析爲bean的類型。因此若是使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。若是既不指定name也不指定type屬性,這時將經過反射機制使用byName自動注入策略。

@Resource裝配順序

1. 若是同時指定了name和type,則從Spring上下文中找到惟一匹配的bean進行裝配,找不到則拋出異常

2. 若是指定了name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常

3. 若是指定了type,則從上下文中找到類型匹配的惟一bean進行裝配,找不到或者找到多個,都會拋出異常

4. 若是既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;若是沒有匹配,則回退爲一個原始類型進行匹配,若是匹配則自動裝配;

@Component、@Repository、@Service、@Controller

Spring 2.5 中除了提供 @Component 註釋外,還定義了幾個擁有特殊語義的註釋,它們分別是:@Repository、@Service 和 @Controller。

在目前的 Spring 版本中,這 3 個註釋和 @Component 是等效的,可是從註釋類的命名上,很容易看出這 3 個註釋分別和持久層、業務層和控制層(Web 層)相對應。

雖然目前這3 個註釋和 @Component 相比沒有什麼新意,但 Spring 將在之後的版本中爲它們添加特殊的功能。

因此,若是 Web 應用程序採用了經典的三層分層結構的話,最好在持久層、業務層和控制層分別採用上述註解對分層中的類進行註釋。

@Service用於標註業務層組件

@Controller用於標註控制層組件(如struts中的action)

@Repository用於標註數據訪問組件,即DAO組件

@Component泛指組件,當組件很差歸類的時候,咱們可使用這個註解進行標註。

  1.  
    @Service
  2.  
    public class VentorServiceImpl implements iVentorService {
  3.  
    }
  4.  
    @Repository
  5.  
    public class VentorDaoImpl implements iVentorDao {
  6.  
    }

在一個稍大的項目中,若是組件採用xml的bean定義來配置,顯然會增長配置文件的體積,查找以及維護起來也不太方便。

Spring2.5爲咱們引入了組件自動掃描機制,他在類路徑下尋找標註了上述註解的類,並把這些類歸入進spring容器中管理。

它的做用和在xml文件中使用bean節點配置組件時同樣的。要使用自動掃描機制,咱們須要打開如下配置信息:

<?xml version="1.0" encoding="UTF-8" ?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <context:annotation-config /> <context:component-scan base-package=」com.iteedu.spring」> </beans>

annotation-config是對標記了@Required、@Autowired、@PostConstruct、@PreDestroy、@Resource、@WebServiceRef、@EJB、@PersistenceContext、@PersistenceUnit等註解的類進行對應的操做使註解生效。

base-package爲須要掃描的包(含全部子包),負責掃描那些類有註解。

可使用如下方式指定初始化方法和銷燬方法:

  1.  
    @PostConstruct
  2.  
    public void init() {
  3.  
    }
  4.  
    @PreDestroy
  5.  
    public void destory() {
  6.  
    }
 
from: http://www.voidcn.com/blog/u013144121/article/p-2933655.html
 

http://iteedu.com/blog/2012/12/18/222.html

相關文章
相關標籤/搜索