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”);