`

Spring 入门 IOC(1)

阅读更多
1.什么是IOC控制反转?
控制反转其实就是把对象的实例化、初始化、销毁这些过程全都交给Spring去实现。由Spring容器去控制对象的生命周期。

2.Spring如何创建实例
(1)用构造器来实例化
Spring 中Bean工厂通过调用该对象的无参构造函数,如果该类缺少无参构造函数,就会报错。

(2)使用静态工厂方法实例化
(3)使用实例工厂方法实例化

3.结合生活例子来谈谈SpringIOC容器
就好比以前我们要做饭,必须要会烧柴、炒菜、下调味料,现在我们用智能电饭锅,只需要放入材料,按下开关就会自动帮我们做好,我们只需要会拿出来吃就可以了。

一般步骤如下:
传统方法
1、HelloWorld.java
     public class HelloWorld{
        public void say(){
           System.out.println(
"hello");

        }
     }

    public static void main(String[]args){
         HelloWorld hw = new HelloWorld();
         hw.say();
    }

2、java--->class   javac.exe

3、把class文件放入到java虚拟机中

4、得到运行结果

spring容器

1、写一个类 HelloWorld

2、把HelloWorld这个类放入到容器中

      以配置文件的形式把类放入到容器中

3、启动spring容器

4、利用spring的API把helloWorld这个对象拿出来

5、helloWorld.say()完成方法的调用
   
说明:创建helloWorld这个类是由spring容器来完成的


4.Spring容器默认情况下什么时候创建对象?如果该对象中有大量属性特别是集合,过早加载,会增加内存负荷,如果解决?延迟加载的优缺点?
(1)
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/application.xml");

Spring 容器默认启动的时候,就已经将配置文件中的所有Bean实例化了。
(2)Spring给我们提供了懒加载方式,lazy-init="ture"表示该类启用懒加载方式,这样可以在改对象真正被使用时,才进行实例化:
  <bean id="helloWorld" class="cn.com.hsbc.domin.HelloWorld" lazy-init="ture"></bean>
  <alias name="helloWorld" alias="傻子"/>


	@Test
	public void test(){
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/application.xml");
		HelloWorld hw = (HelloWorld) applicationContext.getBean("傻子");//启用懒加载后,此时才真正实例化对象
		hw.sayHi();
	}

(3)
优点:lazy-init="ture"延迟加载对象可以使属性多的类减少内存消耗,用到的时候才加载
缺点 :如果配置文件写错了,会导致启动服务器的时候发现不了错误,直到调用的时候才报错
应该根据实际情况来对某些消耗大的类采取懒加载方式,但不是所有类。lazy-init="false"有利于过早发现错误

5.Spring Bean工厂创建实例默认是单例模式还是多里模式?
默认是单例,scope="singleton"。可以根据需求去自定义配置,scope属性决定bean的范围
<bean id="helloWorld" class="cn.com.hsbc.domin.HelloWorld" lazy-init="false" scope="prototype"></bean>
,scope="singleton"要注意并发问题,导致属性全局共用,例如WEB开发中购物车肯定不能用单例,会导致全部用户共用一个购物车

6.IOC总结
springIOC:
   *  spring容器中的bean创建
        *  三种方案   面试题
            *  利用默认的构造函数
            *  利用静态工厂方法
            *  利用实例工厂方法
        *  创建对象的时机
            *  默认情况下,在spring启动的时候,创建纳入spring容器中所有的bean
                  在spring容器启动的时候,可以检查错误
                  但是如果bean的属性中有数据,会过早的加载到内存中,所以如果bean中有数据
                  应该把数据的对象的声明放在方法中
            *  如果在spring的配置文件中,有lazy-init为true,则context.getBean("beanId")时
               才要创建对象
                  缺点:在spring容器启动的时候,是检验不出错误的
        *   对象的作用域
            *  在配置文件中,scope为
                  "singleton" 
                     *  默认值
                     *  spring产生的bean只有一个实例
                     *  处于单例模式的bean的创建、初始化、销毁都是受spring容器管理的
                     *  在容器关闭的时候执行销毁工作
                  "prototype"
                     *  多例
                     *  spring容器负责该bean的创建、初始化,但是销毁工作程序员做
                     *  无论该bean的lazy-init为什么值,都在context.getBean时创建对象(因为这个时候Spring容器根本不知道你将要创建多少个对象,所以它干脆等你调用再创建)
                     *  如果该bean中有资源对象,手动关闭
        *    init和destroy方法
               init在构造器执行完毕之后执行
               destroy方法在spring关闭的时候执行
       
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics