以下内容為個人整理學習驗證,僅供參考。
基于XML的配置
IOC控制反轉:把對象交給Spring IOC控制(建立)
//bean屬性:
//id:對象在容器中唯一辨別,用于擷取對象
//class:指定類的全限定名,用于反射建立對象,預設情況下調用無慘構造方法
//init-method:指定類中的初始化方法名稱
//destroy-method:指定類中銷毀方法名稱
/**scope:指定對象的作用範圍
singleton:預設值,單例的,生命周期(當應用加載建立容器時被建立,隻要容器在就一直活着,
當應用截卸,容器銷毀對象也被銷毀)
prototype:多例的,每次通路對象時都會重新建立,生命周期(當使用對象時建立新的對象執行個體,
隻要對象在使用,就一直活着,當對象長時間不使用,被java垃圾回收器回收)
request:将Spring建立的bean對象存入到request域中
session:将Spring建立的bean對象存入到session域中
*/
<bean id="company" class="com.zww.model.Company"></bean>
DI依賴注入:對象的依賴、屬性的注入
- 構造函數注入:
public class User{
private String name;
private Integer age;
public User(String name, Integer age){
this.name = name;
this.age = age'
}
}
/**
使用構造函數方式,類中需要有一個對應參數清單的構造函數
constructor-arg屬性:
index:參數在構造函數參數清單的索引位置
name:參數在構造函數中的名稱
value:val值,隻能指派基本資料類型和String類型
ref:指派指向其他bean類型,需要時在配置檔案中配置過的bean
**/
<bean id="user" class="com.zww.model.user">
<constructor-arg name="name" value="ZHW"></constructor-arg>
<constructor-arg name="age" value="26"></constructor-arg>
</bean>
- set方法注入
<bean id="company" class="com.zww.model.Company">
<property name="name" value="天***科技"></property>
<property name="address" value="北京市朝陽區"></property>
</bean>
- p名稱空間注入
引入p名稱空間:
在schema的名稱空間中加入:xmlns:p="http://www.springframework.org/schema/p"
<bean id="company" class="com.zww.model.Company" p:name="天***科技"
p:address="北京市朝陽區">
</bean>
ps:示例
//簡單類型 value
<bean id="company" class="com.zww.model.Company">
<property name="name" value="天***科技"></property>
<property name="address" value="北京市朝陽區"></property>
</bean>
//引用類型 ref
<bean id="user" class="com.zww.entry.User">
<property name="name" value="ZHW"></property>
<property name="age" value="26"></property>
<property name="company" ref="company"></property>
</bean>
//集合類型(數組)
<bean id="address" class="com.zww.entry.Address">
<property name = "address">
//List集合
<list>//list中如果是pojo類型使用bean标簽
<value>北京</value>
<value>上海</value>
</list>
//Set集合
<set>北京</set>
<set>上海</set>
//Map集合
<map>
<entry key="key1" value = "val1"/>
<entry key="key2" value = "val2"/>
</map>
//Properties集合
<props>
<prop key = "key1">val1</prop>
<prop key = "key2">val2</prop>
</props>
</property>
</bean>
基于注解配置
IOC基于注解的使用:
注解使用前需要在xml中配置:
<!-- 開啟注解并掃描指定包中帶有注解的實作類 -->
<content:component-scan base-package="com.zhw"></content:component-scan>
// value:指定bean的id,如果不指定預設為目前類名首字母小寫
@Component
一般用在實作類上,把資源讓Spring來管理,相當于xml中的配置一個<bean>
下面三個注解是針對@Component注解衍生注解,作用和屬性一樣,隻是提供了更加明确的語義化。
@Controller一般用于表現層的注解
@Service一般用于業務層的注解
@Repository一般用于持久層的注解
DI基于注解的使用:
相當于标簽<property name="" value=""></property>
// 預設按照類型裝配(byType),spring自帶注解,預設要求依賴對象必須存在,如果允許為null
// 可以通過屬性@Autowird(required=false)設定
// 如果想按照名字裝配(byName)需要結合注解@Qualifier使用
@Autowired
// 在自動按照類型注入的基礎之上,再按照bean的id注入
// 再給字段注入時不能單獨使用,需要和@Autowired一起使用,但是給方法注入時可以獨立使用
@Qualifier
// 預設按照名稱裝配,可以通過name指定名稱,如果不指定當注解解除安裝字段上時按照注解字段名
// 查找,當找不到時按照類型進行裝配;如果name屬性一旦指定,隻會按照名稱進行裝配
@Resource
// 根據類型自動裝配,如果需要按照名稱進行裝配需要配合@Named使用
@Inject
// 給基本類型和String類型注入值,可以通過占位符擷取屬性檔案中的值
@Value
<!-- 擴充
@Autowired、@Resource、@Inject差別:
1.@Autowired是Spring自帶的,@Inject是JSR330規範實作的,@Resource是JSR250實作的,需要
導入不同的依賴包
2.@Autowired 和@Inject用法基本一樣,不同是@Autowired多了request屬性
3.@Autowired 和@Inject按照類型比對,@Resource按照名稱比對
4.@Autowried如果需要按照名稱比對需要和@Qualifier一起使用,@Inject需要和@Named一起使用
-->
// 指定bean的作用範圍,相當于标簽<bean>scope屬性
@Scope
// 相當于标簽<bean>init-method屬性 初始化方法名稱
@PostConstruct
// 相當于标簽<bean>destroy-method屬性 銷毀方法名稱
@Predestroy
純注解使用:
// 相當于Spring的xml配置檔案
@Configuration
// 相當于bean标簽,主要用來配置非自定義的bean,@Bean标注在方法上,傳回某個執行個體方法
@Bean
// 相當于标簽<context:compontent-scan> 開啟注解掃描
@ComponentScan
// 相當于标簽<context:property-placeholder> 編輯在類上,用來加載properties配置檔案
@PropertySource
// 相當于标簽<import> 用來組合多個配置類,在引入其他配置類時
@Import
驗證
- 建立Spring項目:
預設點選下一步建立完成
- 工作環境配置:
依賴配置
建立xml配置檔案
- 編寫開發驗證:
建立對象
對象控制權交給Spring,并進行屬性注入
執行驗證
Spring IOC:spring-core包含了IOC技術,IOC主要是為了管理對象以及對象的依賴關系。
Bean管理繼承關系
BeanFactory:Spring IOC底層設計,提供了先進的比對機制。
ApplicationContext接口繼承自BeanFactory,實作了許多接口的擴充。
差別:
BeanFactory實作的是按需加載,即第一次擷取Bean才會建立這個Bean,而ApplicationContext會一次性建立所有Bean。BeanFactory是ApplicationContext的父接口,ApplicationContext提供了個性化功能,比如支援國際化、時間通知等,通常使用ApplicationContext,ApplicationContext常見接口實作ClassPathXmlApplicationContext
使用:
使用示例