- [ ] 想寫(xiě)成一個(gè)系列,目錄待定
初識(shí)Spring
Spring 是什么和在java開(kāi)發(fā)中的地位就不詳細(xì)描述了。這里大部分也都是老生重談,重點(diǎn)寫(xiě)一些我get到的小細(xì)節(jié)。
直接使用Spring
對(duì)于大多數(shù)人來(lái)說(shuō)Spring,首先代表的是SSH中的S,幾乎脫離了SSH環(huán)境,在不搜索的情況下,不會(huì)使用Spring。所以我們先直接使用以下Spring,會(huì)有一些直觀的感受。
環(huán)境配置
Spring 插件
這里用STS的插件,或者直接用STS的IDE,重要的是它有一個(gè)Spring Bean Configuration File,可以選擇。這樣可以聲明那一堆麻煩的聲明,可以選,不怕手敲的錯(cuò)誤,不怕版本不正確。(我當(dāng)時(shí)最怕搞這些東西,每次都去找別的工程去copy,要不然就去spring的jar包里去找,挺麻煩的)
類(lèi)似 xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
Spring 最基礎(chǔ)依賴包
- spring-core
- spring-beans
- spring-context
- spring-expression
- commons-logging
Spring HelloWorld
create Bean
一個(gè)標(biāo)準(zhǔn)的javabean 有g(shù)et 和 set 方法(這里放的東西會(huì)稍微多一些,為后續(xù)使用)
public class UserEntity {
private String name;
private String pass;
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("setName is working ....");
this.name = name;
}
public void setName3(String name) {
System.out.println("setName3 is working ....");
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public UserEntity() {
System.out.println("UserEntity Construct is working.....");
}
創(chuàng)建Bean配置文件
<bean id="userEntity" class="com.nina.spring.work.UserEntity" >
<property name="name3" value="Spring"></property>
</bean>
客戶端使用
//1.創(chuàng)建容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//2 獲得Bean
UserEntity user = (UserEntity)ctx.getBean("userEntity");
這樣就可以使用了,name的值可以發(fā)現(xiàn)是依賴spring注入的。
需要體會(huì)的幾個(gè)點(diǎn)
- 在代碼的第一步,創(chuàng)建容器的時(shí)候,對(duì)容器中的Bean就已經(jīng)完成的初始化和注入值。
- 說(shuō)人話就是,
- 對(duì)管理的Bean調(diào)用構(gòu)造方法
- 對(duì)property屬性注入的值,調(diào)用set方法。這里沒(méi)有看源碼,不過(guò)是對(duì)屬性前面加了set(上例中調(diào)用的屬性name3,與Bean中setName3對(duì)應(yīng)。)
Spring 補(bǔ)充基礎(chǔ)
- spring 是一個(gè)IOC(DI)和 AOP 容器
Spring 結(jié)構(gòu)圖
根據(jù)這個(gè)圖,所以在前面,我們導(dǎo)入spring的包的時(shí)候,確認(rèn)這4個(gè)包是必須的。
- Core 和 Beans 兩個(gè)模塊 提供了框架的基本支持, 主要包含了 IOC (控制反轉(zhuǎn)) 和 DI (依賴注入) 特性, BeanFacotry 作為工廠模式的超級(jí)接口, 耦合低
- Context 模塊 在 core 和 beans 兩個(gè)模塊基礎(chǔ)之上構(gòu)建, 繼承了beans模塊特性, 并且添加了國(guó)際化支持,事件傳播,資源加載, 開(kāi)發(fā)式的上下文構(gòu)建, 還支持 J2EE 特性,如EJB,JMX,還有基本的遠(yuǎn)程調(diào)用, 超級(jí)接口 ApplicationContext
- Expression Language 表達(dá)式支持, 這個(gè)主要就是用來(lái)支持一些spring XML 配置文件表達(dá)式 和 注解中一些表達(dá)式解析,讓配置有動(dòng)態(tài)特性
IOC & DI
Inversion of Control
就是需要使用bean資源的時(shí)候,傳統(tǒng)方式去new,這里是由spring容器推送,這個(gè)過(guò)程與傳統(tǒng)反過(guò)來(lái)了,所以叫反轉(zhuǎn)控制。
IOC 類(lèi)似于簡(jiǎn)單工廠模式
Dependency Injection
資源以約定的方式接受來(lái)自容器的注入(例如setter)