SpringBoot註解

SpringBoot僅僅是一個「膠水」,一種使用註解來替代XML配置的庫。它的註解實際上是SpringMVC的註解。java

1、三層架構:控制層、服務層、業務層

控制層Controller:調用Service層
服務層Service:調用Repository層
業務層Repository:DAO層spring

@Component 對那些比較中立的類進行註釋架構

一、@controller 控制器(注入服務)
二、@service 服務(注入dao)
三、@repository dao(實現dao訪問)
四、@component (把普通pojo實例化到spring容器中,至關於配置文件中的 ide

@Component,@Service,@Controller,@Repository註解的類,並把這些類歸入進spring容器中管理。
下面寫這個是引入component的掃描組件
<context:component-scan base-package=」com.mmnc」>測試

其中base-package爲須要掃描的包(含全部子包)
一、@Service用於標註業務層組件
二、@Controller用於標註控制層組件(如struts中的action)
三、@Repository用於標註數據訪問組件,即DAO組件.
四、@Component泛指組件,當組件很差歸類的時候,咱們可使用這個註解進行標註。
@Service public class UserServiceImpl implements UserService { }
@Repository public class UserDaoImpl implements UserDao { } getBean的默認名稱是類名(頭字母小寫),若是想自定義,能夠@Service(「***」) 這樣來指定,這種bean默認是單例的,若是想改變,可使用@Service(「beanName」)
@Scope(「prototype」)來改變。可使用如下方式指定初始化方法和銷燬方法(方法名任意): @PostConstruct public void init() { }ui

在標註組件等資源時候,能夠加上名稱例如 @Component("stuDaoImpl") 。默認的名稱是 類名首字母小寫。可是最好直接使用默認名稱。this

import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import com.bjsxt.dao.*;
import com.bjsxt.model.Student;
@Component("stuDaoImpl")
public class StudentDaoImpl implements StudentDao{
    @Override
    public void StudentSave(Student s) {
          System.out.println("學生被保存!");
    }
}

使用Bean注入有兩種方式:prototype

  • 按照類型(默認,通常夠用)
  • 按照名稱(更加靈活,一個類型能夠有多種Bean,好比一個接口有兩個實現類)

在測試中,不能使用new的方式來建立Component,那樣會致使Component中的某些屬性沒有被注入。正確姿式之一是:Context#getBeancode

2、@Autowired@Resource的區別

一、@Autowired@Resource均可以用來裝配bean. 均可以寫在字段上,或寫在setter方法上。
注意:放在setter方法上就是畫蛇添足,確定放在字段上更直觀更簡單。
二、@Autowired默認按類型裝配(這個註解是屬業spring的),默認狀況下必需要求依賴對象必須存在,若是要容許null 值,能夠設置它的required屬性爲false,如:@Autowired(required=false),若是咱們想使用名稱裝配能夠結合@Qualifier註解進行使用,以下:component

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

三、@Resource(這個註解屬於J2EE的),默認安照名稱進行裝配,名稱能夠經過name屬性進行指定,
若是沒有指定name屬性,當註解寫在字段上時,默認取字段名進行按照名稱查找,若是註解寫在setter方法上默認取屬性名進行裝配。 當找不到與名稱匹配的bean時才按照類型進行裝配。可是須要注意的是,若是name屬性一旦指定,就只會按照名稱進行裝配。

@Resource(name="baseDao")     
private BaseDao baseDao;

我喜歡用@Resource註解在字段上,且這個註解是屬於J2EE的,減小了與spring的耦合。最重要的這樣代碼看起就比較優雅。

3、靜態注入

將Bean做爲成員變量,若須要自動注入,必須給Bean加上Component、Controller、Service、Repository類型的註解。

定義一個類A,它有一個屬性haha。

@Component
class A{
  @Value("${haha}")
  String haha;
}

定義一個類B,他有一個屬性A

@Component 
class B{
  @Resource
  A a;
}

在類中使用@Value註解讀取屬性,必須將A定義爲Component類型的,這樣Spring纔會檢查A類中的Value註解。
在B類中,要想讓Spring檢查@Resource@Autowired註解,就必須將B定義爲Component類型。
要想將A a;自動注入,須要知足條件:Spring知道A類型,也就是說A類型必須是Component,這樣Spring的Bean倉庫中才有這樣的Bean

自動注入有兩種註解,它們使用上差異不大:

  • @autowired是Spring的註解
  • @Resource是Java自帶的註解

自動注入有兩種寫法:

  • 直接註解成員變量
  • 註解setter方法,這種方式其實是Spring調用setter方法,傳遞的參數就是須要注入的那個Bean

註解setter方法是更加通用的方法,註解成員變量是更加簡便的方法。
下面舉例說明:
方式一:

class B{
  @Resource
  A a;
}

方式二:

class B{
  @Resource
  void setA(A a){
    this.a=a;
  }
  A a;
}

跟方式一直接註解屬性相比,方式二註解setter方法看上去畫蛇添足,而實際上,方式二更加靈活。
請看以下兩個場景:
場景一:對注入的Bean作必定的更改

class B{
  @Resource
  void setA(A a){
    a.setName("haha");//對注入的對象作必定的更改
    this.a=a;
  }
  A a;
}

場景二:注入靜態成員變量
對於靜態成員變量,即使使用@Resource進行註解,Spring並不會爲你自動注入。

class B{
  @Resource
  void setA(A a){
    a.setName("haha");//對注入的對象作必定的更改
    B.a=a;//對靜態成員進行注入
  }
  static A a;
}
相關文章
相關標籤/搜索