在Spring中,那些組成你應用程序的主體(backbone)及由Spring IoC容器所管理的對象,被稱之爲bean。 簡單地講,bean就是由Spring容器初始化、裝配及管理的對象,除此以外,bean就與應用程序中的其餘對象沒有什麼區別了。 而bean定義以及bean相互間的依賴關係將經過配置元數據來描述。java
spring推薦面向接口編程
spring
package cn.nevo.service; public interface HelloService { public void sayHello(); }
package cn.nevo.service.impl; import cn.nevo.service.HelloService; public class HelloServiceImpl implements HelloService { private String message; //當用set注入時,一個空的構造方法是必須的 public HelloServiceImpl() {} public HelloServiceImpl(String message) { this.message = message; } public void setMessage(String message) { this.message = message; } @Override public void sayHello() { System.out.println("hello " + message); } }
spring配置文件bean.xml(在這裏決定如何配置bean及多個bean之間的依賴關係)
編程
<?xml version="1.0" encoding="UTF-8"?> <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-2.5.xsd"> <bean id="helloService" class="cn.nevo.service.impl.HelloServiceImpl"> <!-- 採用此種注入方式,容器實例化配置的Bean:HelloServiceImpl的時候會調用 它的setMessage方法完成賦值 --> <property name="message"> <value>world!</value> </property> <!-- 採用此種注入方式,容器會使用帶有一個參數的構造器 實例化配置的Bean:HelloServiceImpl從而完成賦值 <constructor-arg> <value>world!</value> </constructor-arg> --> </bean> </beans>
一般咱們會看到拆分的元數據配置文件,這種作法是值得推薦的,它使得各個模塊之間的開發分工更明確,互不影響,如:ide
<beans> <import resource="model1.xml"/> <import resource="model2.xml"/> <import resource="model3.xml"/> <bean id="bean1" class="..."/> <bean id="bean2" class="..."/> </beans>
測試類HelloServiceTest.java 測試
package cn.nevo.service; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.nevo.service.impl.HelloServiceImpl; public class HelloServiceTest { @Test public void testHelloService() { ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml"); HelloService hs = (HelloServiceImpl)ctx.getBean("helloService"); hs.sayHello(); } }
Spring IoC容器經過讀取spring配置文件實例化,以下面的例子:this
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] {"services.xml", "daos.xml"});// an ApplicationContext is also a BeanFactory (via inheritance)
BeanFactory factory = context;
org.springframework.beans.factory.BeanFactory 是Spring IoC容器的實際表明者,IoC容器負責容納此前所描述的bean,並對bean進行管理。在Spring中,BeanFactory是IoC容器的核心接口。 它的職責包括:實例化、定位、配置應用程序中的對象及創建這些對象間的依賴。Spring爲咱們提供了許多易用的BeanFactory實現。spa
org.springframework.context包的核心是ApplicationContext接口。它由BeanFactory接口派生而來,於是提供了BeanFactory全部的功能。而且提供了一些更加通用的實現。BeanFactory就是spring容器,負責如何建立,配置和管理咱們的Bean,採用工廠模式實現Ioc,將系統配置和依賴關係從具體業務代碼中獨立出來。.net
Spring IoC容器將讀取配置元數據,並經過它對應用中各個對象進行實例化、配置以及組裝。code
Beanfactory接口結構圖:xml
本示例項目結構圖: