Spring容器
spring容器可以帮助管理所有的Bean对象, 在spring容器读取Bean实例之前,必须对容器进行实例化,只有在容器实例化后,才可以从容器里获取Bean实例并使用
Spring提供了两种类型的容器实现
BeanFactory: IOC 容器的基本实现.
ApplicationContext: 提供了更多的高级特性.是BeanFactory的子接口.
BeanFactory 是 Spring框架的基础设施,面向Spring本身;ApplicationContext面向使用Spring框架的开发者,几乎所有的应用场合都直接使用ApplicationContext而非底层的BeanFactory
三个容器:
1:ConfigurableApplicationContext扩展于ApplicationContext,新增加两个主要方法:refresh()和close(), 让ApplicationContext具有启动、刷新和关闭上下文的能力
2:ApplicationContext在初始化上下文时就实例化所有单例的Bean。
ApplicationContext 的主要实现类:
ClassPathXmlApplicationContext("spring.xml")从类路径下加载配置文件
FileSystemXmlApplicationContext("classpath:spring.xml") 从文件系统中加载配置文件
3:WebApplicationContext是专门为WEB应用而准备的,它允许从相对于WEB根目录的路径中完成初始化工作
spring的IOC项目创建
1:IOC和DI
IOC(Inversion of Control)(控制反转):其思想是反转资源获取的方向,传统的资源查找方式要求组件向容器发起请求查找资源,作为回应,容器适时的返回资源。而应用了IOC之后
则是容器主动的地将资源推送给它所管理的组件,组件所做的仅仅是选择一种合适的方式来接受资源,这种行为也被称之为查找的被动形式。
DI(Dependency Injection)(依赖注入)---IOC的另一种表述方式:即组件以一些预先定义好的方式(例如:setter方法)接受来自容器的资源注入。相对于IOC而言,这种表述更直接
2:项目的创建
《1》首先要加入spring所需的jar包,可以在maven项目的pom.xml文件中直接添加一个依赖,可以直接引入spring所需的几个jar包,依赖如下,可选择版本。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
</dependencies>
《2》此外还需要一个必不可少的xml文件,用来实例化一些对象,文件自己创建,文件名可以随意,可以放在resources目录下、
示例:
<?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.xsd">
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
3创建与使用一个Bean。
<bean id="别名" class="对象的路径"></bean>
注意:id:Bean的名称,在IOC容器里必须是唯一的。如果没有指定id的类,默认的名字是“类名#编号”
从IOC容器中获取Bean:调用ApplicationContext的getBean()方法.
例:
User user=(User)context.getBean("user");
System.out.println(user.getUser().getName());
4:依赖注入的方式:
依赖注入就是给Bean的属性添加值。
Spring支持3种依赖注入的方式
《1》属性注入
属性注入即通过setter方法注入Bean的属性或依赖的对象。
属性注入使用<property>元素,使用name属性指定Bean的属性名称,value属性或<value>子节点指定属性值。属性注入是实际应用中最常用 的注入方式:示例:
<bean id="user" class="com.et.bean.User">
<property name="id" value="1001"></property>
</bean>
引用其他bean:组成应用程序的Bean经常需要互相协作以完成应用程序的功能,使Bean能够相互访问,在Bean配置文件中指定对Bean的应用,在Bean的配置文件中,可以通过<ref>元素为Bean的属性或构造参数指定对Bean的引用:
<
bean id="user1" class="com.et.bean.User">
<property name="id" ref=”user”></property>
</bean>
应用名为user的Bean。
《2》构造器注入
通过构造方法注入bean的属性值或依赖的对象,它保证了Bean实例在实例化后就可以使用。
按索引匹配入参,index代表构造方法中的参数下标,value代表值
<bean id="userConstructorIndex" class="com.et.bean.User">
<constructor-arg index="0" value="3"></constructor-arg>
<constructor-arg index="1" value=属性注入"></constructor-arg>
</bean>
按类型匹配入参,type代表构造方法中的参数的类型,value代表值
<bean id="userConstructorType" class="com.et.bean.User">
<constructor-arg type=”int” value="3"></constructor-arg>
<constructor-arg index="java.lang.String" value=属性注入"></constructor-arg>
</bean>
《3》工厂方法注入(很少使用)