Java实训(2)-- Spring 核心 之 IOC - 20

2018-06-08  本文已影响0人  空心老竹

Spring

1.将类交给spring进行管理

2.构造spring工厂对象(BeanFactory,ApplicationContext)

3.通过spring工厂得到实例化对象


Spring IOC的几种注入方式

  1. 构造器注入

  2. 属性注入

  3. 接口注入

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 的两种工作环境

  1. ApplicationContext

  2. BeanFactory

1. ApplicationContext

  1. 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后面 -->
  1. 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配置对象的作用范围(与生命周期类似

  1. prototype - 原型模式,每调用一次getBean都会产生一个新的对象

  2. singleton - 单例模式,在同一个spring上下文环境中只有一个实例对象

-- 在web环境中,还有request,session,application :

  1. request - 请求模式,在同一次http请求中只有一个对象实例

  2. session - 回话模式,在同一个HttpSession会话中只有一个对象实例

  3. application - 应用模式,在同一个应用程序中只有一个对象实例

上一篇下一篇

猜你喜欢

热点阅读