SpringBoot僅僅是一個「膠水」,一種使用註解來替代XML配置的庫。它的註解實際上是SpringMVC的註解。java
控制層Controller:調用Service層
服務層Service:調用Repository層
業務層Repository:DAO層spring
用 @Component
對那些比較中立的類進行註釋架構
一、@controller
控制器(注入服務)
二、@service
服務(注入dao)
三、@repository
dao(實現dao訪問)
四、@component
(把普通pojo實例化到spring容器中,至關於配置文件中的
@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
在測試中,不能使用new的方式來建立Component,那樣會致使Component中的某些屬性沒有被注入。正確姿式之一是:Context#getBeancode
@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的耦合。最重要的這樣代碼看起就比較優雅。
將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方法是更加通用的方法,註解成員變量是更加簡便的方法。
下面舉例說明:
方式一:
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; }