更新時(shí)間:2018-07-24 來(lái)源:黑馬程序員 瀏覽量:
由我們自己實(shí)例化的對(duì)象交給spring容器來(lái)實(shí)始化。這時(shí)對(duì)象的初始化的權(quán)利就會(huì)反轉(zhuǎn)。
DI
dependency injection 依賴(lài)注入
在spring框架負(fù)責(zé)創(chuàng)建Bean對(duì)象時(shí),動(dòng)態(tài)將依賴(lài)對(duì)象注入到Bean組件
IOC/DI區(qū)別
IOC 控制反轉(zhuǎn),是指對(duì)象實(shí)例化權(quán)利由spring容器來(lái)管理
DI 依賴(lài)注入 在spring創(chuàng)建對(duì)象的過(guò)程中,對(duì)象所依賴(lài)的屬性通過(guò)配置注入對(duì)象中。
Spring Bean基本步驟
1.導(dǎo)入相關(guān)jar包
spring-beans-4.2.4.RELEASE.jar
spring-context-4.2.4.RELEASE.jar
spring-core-4.2.4.RELEASE.jar
spring-expression-4.2.4.RELEASE.jar
2.導(dǎo)入相關(guān)日志包
commons-logging-1.2.jar
log4j-1.2.16.jar
3.在項(xiàng)目的src目錄下創(chuàng)建applicationContext.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id="userService" class="com.b3a4a.ioc.UserServiceImpl">
<!-- 通過(guò)依賴(lài)注入將cnB3a4a這個(gè)值注到實(shí)例對(duì)象的info屬性中 -->
<property name="info" value="cnB3a4a"></property>
</bean>
</beans>
注意:
<bean></bean>標(biāo)簽注意事項(xiàng)
在開(kāi)發(fā)中可以使用id或name
id它遵守xml規(guī)范,名稱(chēng)中不能包含特殊符號(hào)
name它是為了更好的擴(kuò)展,在name中可以包含一些特殊符號(hào),例如"_"
4.創(chuàng)建接口(IUserService)和實(shí)現(xiàn)類(lèi)(UserServiceImpl)
public interface IUserService {
public void hello();
}
public class UserServiceImpl implements IUserService {
private String info;
@Override
public void hello() {
System.out.println("hello " + info);
}
//省略get/set方法
......
}
5.獲取對(duì)象實(shí)例
@Test
public void test(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
IUserService service = (IUserService) applicationContext.getBean("userService");
service.sayHello();
}
上面就是一個(gè)基本的使用步驟了,但是這個(gè)只是一個(gè)最基本的入門(mén),那么接下來(lái)咱們則開(kāi)始給大家一點(diǎn)點(diǎn)的引入
首先,大家需要明確一個(gè)問(wèn)題,那就是我們這個(gè)Spring Bean這塊的作用是什么?
很簡(jiǎn)單,就是我們相關(guān)對(duì)象以前是通過(guò)自己new 對(duì)象的形式來(lái)創(chuàng)建的,現(xiàn)在呢,則改為讓框架統(tǒng)一對(duì)咱們的對(duì)象進(jìn)行管理.所以咱們先來(lái)看下在Spring中,我們的對(duì)象究竟是有誰(shuí)來(lái)創(chuàng)建的.當(dāng)然.說(shuō)簡(jiǎn)單點(diǎn),其實(shí)底層實(shí)現(xiàn)起來(lái)是通過(guò) 解析xml配置文件+反射+工廠模式來(lái)實(shí)現(xiàn)的, 而我們?cè)谑褂玫倪^(guò)程中,我們真正需要了解的就是所謂的對(duì)象是通過(guò)哪些工廠來(lái)實(shí)現(xiàn)的呢?
1)BeanFactory
2)ApplicationContext
3)ClassPathXmlApplicationContext
4)FileSystemXmlApplicationContext
5)WebApplicationContext
他們之間的關(guān)系
BeanFactory(根接口) --> ApplicationContext(子接口)
至于ClassPathXmlApplicationContext,FileSystemXmlApplicationContext,WebApplicationContext則是一個(gè)個(gè)具體的實(shí)現(xiàn)類(lèi),當(dāng)然這里先和大家說(shuō)聲,真實(shí)開(kāi)發(fā)中都是使用
WebApplicationContext來(lái)實(shí)例化咱們的spring bean容器,但是這個(gè)工廠我們不需要自己去創(chuàng)建,通過(guò)一些配置,我們就能讓這個(gè)對(duì)象在咱們項(xiàng)目啟動(dòng)的時(shí)候自動(dòng)初始化~
創(chuàng)建工廠的方式
a)通過(guò)BeanFactory來(lái)獲取
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
b)通過(guò)ClassPathXmlApplicationContext來(lái)獲取
ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml");
c)通過(guò)FileSystemXmlApplicationContext來(lái)獲取
ApplicationContext factory = new FileSystemXmlApplicationContext("src/applicationContext.xml");
通過(guò)工廠獲取實(shí)例對(duì)象
IBean bean = (IBean) factory.getBean("bean");
但是這里有一個(gè)小小的知識(shí)點(diǎn)需要告訴大家,BeanFactory是延遲加載,ApplicationContext是加載配置文件的時(shí)候加載
ok.那么到此為止,咱們對(duì)Springbean這塊有了個(gè)基本認(rèn)識(shí),下次的話(huà)就給大家去聊下如何玩轉(zhuǎn)ioc和di(xml和注解的方式)
首發(fā):http://java.itheima.com/