Java实训(2)-- Spring 核心 之 IOC - 20
2018-06-08 本文已影响0人
空心老竹
Spring
1.将类交给spring进行管理
2.构造spring工厂对象(BeanFactory,ApplicationContext)
3.通过spring工厂得到实例化对象
Spring IOC的几种注入方式
构造器注入
属性注入
接口注入
1. 通过构造器注入值
调用构造方法进行注入,类的构造方法必须存在
注入的参数类型与属性一致
可以指定参数或者不指定参数
指定参数可以乱序(通过 name 或 index 来指定参数)
不指定参数必须按照构造方法的参数顺序
<bean id="Book" class="com.neuedu.springcore.Book">
<!-- 构造参数 -->
<!-- name存在时无序,name不存在时参数必须有序 -->
<constructor-arg name="isbn" value="ISBN-11111111-111"></constructor-arg>
<constructor-arg name="bookName" value="构造参数- springCore"></constructor-arg>
<constructor-arg name="publishDate" ref="nowTime"></constructor-arg>
<constructor-arg name="price" value="1234"></constructor-arg>
</bean>
2. 通过属性注入值
注入时会使用反射机制查找 set 方法
注入的参数类型
基本数据类型(数值类型,字符类型 等)
对象类型
集合类型 ( set,list,map,数组 等)
<bean id="nowTime" class="java.util.Date"></bean>
<bean id="Book" class="com.neuedu.springcore.Book">
<!-- 属性设置 -->
<property name="bookName" value="springCore"></property>
<!-- ref 引用其他bean, ref 的值设置为 其他 bean 的 ID-->
<property name="publishDate" ref="nowTime"></property>
<property name="isbn" value="ISBN-1234556-2134"></property>
<!-- 值可以用 value 标签 放在 property 标签内 -->
<property name="price" >
<value>1234</value>
</property>
<!-- 设置 List 参数 -->
<property name="tags">
<list>
<value>spring</value>
<value>计算机</value>
<value>软件</value>
</list>
</property>
</bean>
Spring 的两种工作环境
ApplicationContext
BeanFactory
1. ApplicationContext
- ApplicationContext读取xml配置的两种方式:
1. ApplicationContext context = new ClassPathXmlApplicationContext(“applicationContext.xml”);
2. ApplicationContext context = new FileSystemXmlApplicationContext("src\\applicationContext.xml");
使用ApplicationContext加载配置文件时,spring会按照先后顺序实例化对象,
如果对象间使用构造器进行引用或关联,则会修改实例化的先后顺序,把依赖关系的类先进行实例化
<bean id="Book" class="com.neuedu.springcore.Book">
<constructor-arg ref="Category"></constructor-arg>
</bean>
<bean id="Category" class="com.neuedu.springcore.Category"></bean>
<!-- Book对象引用了Category对象,所以先实例化Category对象,即使Category 在 Book后面 -->
- Java 代码获取对象实例:
//通过bean id获取对象实例(强制转换类型)
Book book = (Book) context.getBean("Book");
//通过泛型获取对象实例
Book book = context.getBean(Book.class);
2. BeanFactory (现在基本不用此方式)
ClassPathResource resource = new ClassPathResource("config/lifeConfig.xml");
BeanFactory factory = new XmlBeanFactory(resource);
Book book = factory.getBean(Book.class);
Bean 的作用域
在spring使用scope配置对象的作用范围(与生命周期类似
-
prototype - 原型模式,每调用一次getBean都会产生一个新的对象
-
singleton - 单例模式,在同一个spring上下文环境中只有一个实例对象
-- 在web环境中,还有request,session,application :
-
request - 请求模式,在同一次http请求中只有一个对象实例
-
session - 回话模式,在同一个HttpSession会话中只有一个对象实例
-
application - 应用模式,在同一个应用程序中只有一个对象实例