spring的IOC学习

1.spring之IOC

1.1 IOC的概念

所谓的IOC称之为控制反转,简单来说就是将对象的创建和对象的生命周期管理的过程交给Spring框架处理,从此在开发过程中不再需要关注这些细节。需要使用到对象时,直接从Spring框架中获取。

1.2 IOC的使用

导包

配置核心文件

 

 1.3 IOC的启动原理

当初始化一个Sring容器时,会先去指定路径下寻找到xml,然后解析,回去到bean标签的class属性对应的值。根据全路径名通过反射技术获取对象,并且以id的值为key,对象的值为value,存入到map中。

当我们使用getBean获取对象时,从map中通过传入的key获取值,如果获取到,那么就返回对象,如果获取不到,返回null

  • 默认情况下,多次获取同一个id的bean,得到的是同一个对象

  • 即使是同一个类,如果配置过多个不同id标签,每个id都会在内存中创建一个新的对象,不同的id就是对应的类型相同,但是对象也不同。

  • 同一个beans标签下,不允许出现相同的id

1.4 IOC获取对象的方式

1.4.1 传入ID

Person person = (Person) applicationContext.getBean("person");

1.4.2 传入class

Person person = applicationContext.getBean(Person.class);

1.4.3 传入ID和class

Person person = applicationContext.getBean("person", Person.class);

1.5 spring创建对象的方式

1.5.1 通过无参构造创建

默认调用的是无参构造的方式创建对象,使用这种方式,一定要保证类中有无参构造,否则抛出异常

1.5.2 通过静态工厂创建

applicationContext.xml中配置

<!--静态工厂创建对象:由于是静态方法,类名.方法可直接拿到对象-->
      <bean id="calendarStaticFactory"
 class="com.tsk.edu.factory.CalendarStaticFactory" factory-method="getCalendar"></bean>

 1.5.3 通过实例工厂创建

 applicationContext.xml中配置

<!--实例工厂创建对象:先拿到工厂的实例,再拿到对象-->
      <bean id="calendarObjectFactory" class="com.tsk.edu.factory.CalendarObjectFactory" ></bean>
      <bean id="calendar" factory-bean="calendarObjectFactory" factory-method="getCalendar"></bean>

1.5.4 通过内置工厂创建对象(实现FactoryBean)

package com.tsk.edu.factory;

import org.springframework.beans.factory.FactoryBean;

import java.util.Calendar;

public class CalendarSpringFactory implements FactoryBean<Calendar> {

    @Override
    public Calendar getObject() throws Exception {
        return Calendar.getInstance();
    }

    @Override
    public Class<?> getObjectType() {
        return Calendar.class;
    }
}

 applicationContext.xml中配置

<!--spring内置工厂创建对象-->
      <bean id="calendarSpringFactory" class="com.tsk.edu.factory.CalendarSpringFactory"></bean>

1.6 单例和多例

Spring容器管理的bean在默认情况下是单例的。就是说,一个bean只会创建一个对象,放入到对应的map中。无论根据id获取多少次该bean,都返回的是同一个对象

设置多例

 <bean id="person" class="com.shangma.cn.entity.Person" scope="prototype"></bean>

2.6.1单例模式下bean对象的生命周期

bean在单例模式下,Spring容器启动时解析xml发现该bean标签,直接将对象创建成功并且存入内置的map中保存。此后无论调用多少次getBean()获取该bean属性,都是从map中获取该对象,所以一直是同一个对象。此对象一直被Spring容器持有,直到容器退出时对象才被销毁。

2.6.2 多例模式下bean对象的生命周期

bean在多例模式下,Spring容器启动时解析xml发现该bean标签后,只是将该bean进行管理,并不会创建 对象。此后每次调用getBean()获取该bean时,都会创建一个新的对象,每次都是新的对象。这个对象Spring并不会持有,什么时候销毁取决于使用该对象的用户什么时候销毁对象。

1.7 懒加载机制

所谓的懒加载机制就是可以规定指定的bean不在启动时马上加载,而是在用户真正第一次使用到时才去加载对象。

懒加载机制只对单例bean有作用。对于多例bean设置懒加载没有意义。

局部配置

<bean id="person" class="com.shangma.cn.entity.Person" lazy-init="true"></bean>

全局配置

<?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"
       
       
       default-lazy-init="true"
       >


</beans>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值