IOC概念
IOC:Inversion of Control(控制反轉),既將對象的創建過程交由Spring的IOC容器來進行管理,從而做到解耦合的效果。
Spring的XML配置文件結構
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
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
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd ">
<!-- 導入hello配置文件 -->
<import resource="hello/hello.xml"/>
<!-- 實例化hello -->
<bean id="hello" class="com.wzw.spring.ioc.impl.HelloImpl"></bean>
<!-- hello別名Hello -->
<alias name="hello" alias="Hello"/>
</beans>
Bean實例化的三種方式
1. 基於構造方法
<!-- 基於無參構造 -->
<bean id="user" class="com.wzw.spring.ioc.model.User"></bean>
<!-- 基於有參構造 -->
<bean id="user2" class="com.wzw.spring.ioc.model.User2">
<constructor-arg name="name" value="root"></constructor-arg>
<constructor-arg name="password" value="password"></constructor-arg>
</bean>
2. 基於靜態工廠
靜態工廠
/**
* 靜態工廠
* 項目名稱:com.wzw.spring<br/>
* 類名稱:UserStaticFactory<br/>
* 類描述:
* 時間 2018年4月17日 下午3:38:34
* @author wzw
* @version
*/
public class UserStaticFactory {
public static User getUser(String name, String password) {
return new User(name, password);
}
}
<!-- 基於靜態工廠 -->
<bean id="user3" class="com.wzw.spring.ioc.factory.UserStaticFactory"
factory-method="getUser">
<constructor-arg name="name" value="root"></constructor-arg>
<constructor-arg name="password" value="password"></constructor-arg>
</bean>
3. 基於實例工廠
實例工廠
/**
* 實例工廠
* 項目名稱:com.wzw.spring<br/>
* 類名稱:UserFactory<br/>
* 類描述:
* 時間 2018年4月17日 下午3:42:08
* @author wzw
* @version
*/
public class UserFactory {
public User getUser(String name, String password) {
return new User(name, password);
}
}
<!-- 基於實例工廠 -->
<bean id="userfactory" class="com.wzw.spring.ioc.factory.UserFactory"></bean>
<bean id="user4" factory-bean="userfactory" factory-method="getUser">
<constructor-arg name="name" value="root"></constructor-arg>
<constructor-arg name="password" value="password"></constructor-arg>
</bean>
Bean命名
<!-- id, name相同 -->
<bean id="user5" name="user6" class="com.wzw.spring.ioc.model.User">
<constructor-arg name="name" value="root"></constructor-arg>
<constructor-arg name="password" value="password"></constructor-arg>
</bean>
<!-- 無id -->
<bean class="com.wzw.spring.ioc.model.User">
<constructor-arg name="name" value="root"></constructor-arg>
<constructor-arg name="password" value="password"></constructor-arg>
</bean>
<!-- id, 唯一 -->
<bean id="user7" class="com.wzw.spring.ioc.model.User">
<constructor-arg name="name" value="root"></constructor-arg>
<constructor-arg name="password" value="password"></constructor-arg>
</bean>
<!-- name, 唯一 -->
<bean name="user8" class="com.wzw.spring.ioc.model.User">
<constructor-arg name="name" value="root"></constructor-arg>
<constructor-arg name="password" value="password"></constructor-arg>
</bean>
<!-- 多name -->
<bean name="user9,user10;user11" class="com.wzw.spring.ioc.model.User">
<constructor-arg name="name" value="root"></constructor-arg>
<constructor-arg name="password" value="password"></constructor-arg>
</bean>
<!-- alias標籤 -->
<alias name="user7" alias="user12"/>
測試類
/**
* Bean命名測試
* @return void
* 時間:2018年4月17日
*/
@Test
public void fun2() {
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
String[] aliases = context.getAliases("user9");
System.out.println(aliases.length);
for (String string : aliases) {
System.out.println(string);
}
User bean = (User) context.getBean("user9");
System.out.println(bean);
}
IOC容器實例化方式(Spring讀取配置文件的方式)
在Spring Ioc容器的代表就是org.springframework.beans包中的BeanFactory接口,BeanFactory接口提供了IoC容器最基本功能;而org.springframework.context包下的ApplicationContext接口擴展了BeanFactory,還提供了與Spring AOP集成、國際化處理、事件傳播及提供不同層次的context實現 (如針對web應用的WebApplicationContext)。簡單說, BeanFactory提供了IoC容器最基本功能,而 ApplicationContext 則增加了更多支持企業級功能支持。ApplicationContext完全繼承BeanFactory,因而BeanFactory所具有的語義也適用於ApplicationContext。
容器實現一覽:
• XmlBeanFactory:BeanFactory實現,提供基本的IoC容器功能,可以從classpath或文件系統等獲取資源;
(1) File file = new File(“fileSystemConfig.xml”);
Resource resource = new FileSystemResource(file);
BeanFactory beanFactory = new XmlBeanFactory(resource);
(2)
Resource resource = new ClassPathResource(“classpath.xml”); BeanFactory beanFactory = new XmlBeanFactory(resource);
• ClassPathXmlApplicationContext:ApplicationContext實現,從classpath獲取配置文件;
BeanFactory beanFactory =
new ClassPathXmlApplicationContext(“classpath.xml”);
• FileSystemXmlApplicationContext:ApplicationContext實現,從文件系統獲取配置文件。
BeanFactory beanFactory =
new FileSystemXmlApplicationContext(“fileSystemConfig.xml”);