spring
四大概念
dip:依賴反轉(zhuǎn)埋虹,依賴于抽象,不依賴于具體
ioc:控制反轉(zhuǎn),new對象的權(quán)利交由外界實(shí)現(xiàn)
di:依賴注入秩冈,對象的不在被依賴內(nèi)部創(chuàng)建,而是由外界注入
ioc容器:實(shí)現(xiàn)了ioc設(shè)計(jì)原則的框架
spring簡介
作用:IOC容器斥扛,控制反轉(zhuǎn)入问,將創(chuàng)建對象的權(quán)利交給容器去做
好處:
1、不用new對象稀颁,降低了類與類之間的耦合度
2芬失、面向接口編程
3、整合其他的框架
- 功能:IOC+AOP+DATA+WEB
spring的原理
將bean的類名以及類與類的關(guān)系配置在xml文件中匾灶,通過反射的方式創(chuàng)建對象棱烂,并且組裝對象。
spring快速入門
1粘昨、導(dǎo)包
core.jar垢啼、context.jar窜锯、expression.jar、bean.jar
2芭析、引入schema文檔(類似dtd文檔)約束xml的文檔
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
3锚扎、通過xml配置bean
<!-- 1、配置bean -->
<bean class="com.hemi.bean.CandidateA" id="canA" />
<bean class="com.hemi.bean.CandidateB" id="canB" />
<bean class="com.hemi.bean.Personnel" id="personnel">
<!-- 通過set方法將候選人canA注入到人事部中 -->
<property name="candidata" ref="candidateA"></property>
</bean>
4馁启、創(chuàng)建測試類
//1驾孔、獲取xml文件,并且創(chuàng)建出ApplicationContext
ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
//2惯疙、獲取人事部
Personnel personnel=(Personnel)context.getBean("personnel");
personnel.interview();
xml方式配置詳解
bean的生命周期
id:對象的名字
destory-method:ioc容器摧毀時(shí)創(chuàng)建
init-method:創(chuàng)建對象時(shí)執(zhí)行的方法
depends-on:創(chuàng)建對象之前應(yīng)該創(chuàng)建好的對象
lazy-init:延遲創(chuàng)建對象翠勉,容器初始化時(shí)不參加對象,用的時(shí)候才創(chuàng)建
scope:設(shè)置作用域:singleton(單例)霉颠、prototype(多例)对碌、request、sesssion蒿偎、global session(后面兩個(gè)基本不用)
factory-method:工廠方法
factory-bean:工廠對象
abstract:標(biāo)記為抽象類朽们,不會(huì)創(chuàng)建對象
其中scope、init-method诉位、destory-method是bean的生命周期
屬性注入
- 1骑脱、構(gòu)造函數(shù)方式注入
- constructor-arg 構(gòu)造函數(shù)參數(shù)
- type 使用構(gòu)造函數(shù)參數(shù)類型
- name 使用構(gòu)造函數(shù)參數(shù)名
- index 使用位置 0代表構(gòu)造函數(shù)的第一個(gè)位置,1代表第二個(gè)位置苍糠,依次類推
- constructor-arg 構(gòu)造函數(shù)參數(shù)
例如:
<bean class="com.hemi.bean.Personnel" id="personnel">
<constructor-arg index="0" ref="canB" />
<constructor-arg index="1" ref="canA" />
</bean>
- 2叁丧、set方式注入
- property 代表屬性名稱
- value 屬性值
- ref 對象的引用
- property 代表屬性名稱
<bean class="com.hemi.bean.Personnel" id="personnel">
<property name="name" value="lili"></property>
<property name="programme" ref="canA"></property>
</bean>
- 4、p名稱空間
在文檔定義中添加xmlns:p="http://www.springframework.org/schema/p"
<bean class="com.hemi.bean.Personnel" id="personnel" p:name="lisi"></bean>
注入復(fù)雜數(shù)據(jù)類型
<bean id="complexBean" class="com.spring.bean.ComplexBean">
<property name="username" value="非凡"></property>
<property name="arr">
<array>
<ref bean="paper"/>
<ref bean="paper"/>
</array>
</property>
<property name="list">
<list>
<value>a</value>
<value>b</value>
</list>
</property>
<property name="set">
<set>
<value>1</value>
<value>2</value>
</set>
</property>
<property name="map">
<map>
<!-- <entry>
<key>
<value>a</value>
</key>
<value>abc</value>
</entry>
<entry>
<key>
<value>b</value>
</key>
<value>bcd</value>
</entry> -->
<entry key="a" value="abc"></entry>
<entry key="b" value="bcd"></entry>
</map>
</property>
<property name="prop">
<props>
<prop key="driver">com.mysql.jdbc.Driver</prop>
<prop key="username">root</prop>
</props>
</property>
</bean>
注解方式詳解
注解的使用
1岳瞭、導(dǎo)包:context.jar拥娄、aop.jar
2、添加xsd約束瞳筏,context與aop
<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"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
3条舔、開啟注解
<!--作用:1、開啟注解 2乏矾、掃描指定的包 -->
<context:component-scan base-package="com.spring.bean"></context:component-scan>
注解創(chuàng)建對象
1、創(chuàng)建對象的注解
- @Component
- @Service
- @Repository
- @Controller
而外的注解:@Scope("prototype"),指定為多例的
2迁杨、用法:
//創(chuàng)建對象的時(shí)候可以使用參數(shù)钻心,設(shè)置對象的引用變量
@Component("blackBox")
public class BlackBox{
}
//如果沒有寫,那么默認(rèn)使用小駝峰命名
@Service
public class Paper{
}
3铅协、注意:四者用法一致捷沸,dao層一般使用@Repository,service一般使用@Service狐史,web層一般使用@Controller(在springMVC中痒给,web層只能使用@Controller)
注解注入對象
1说墨、注入對象的注解
- @Resource
- @Autowired
- @Qualifier
2、用法:
//name:按照名稱來查找
@Resource(name="blackBox")
private IBox box;
//type:按照類型來查找
@Resource(type=A4Paper.class)
private IPaper paper;
//如果沒有寫苍柏,那么name就是參數(shù)的變量名 box,所以找不到尼斧,然后按照type來查找,IBox類型试吁,所以可以找得到
//如果沒有寫棺棵,而內(nèi)存中有多個(gè)相同類型的對象,那么就報(bào)錯(cuò)
@Resource
private IBox box1;
//@Autowired不能寫任何參數(shù)
//按照類型來查找熄捍,如果內(nèi)存中有多個(gè)相同類型的對象烛恤,那么報(bào)錯(cuò)
//解決問題:使用@Qualifier來指定注入哪個(gè)名稱的對象
@Autowired
@Qualifier("blackBox")
private IBox box;
@Autowired
private IPaper paper;
注意:推薦使用@Resource,實(shí)際開發(fā)用哪個(gè)注解余耽,請根據(jù)實(shí)際需求選擇