首页 > 代码库 > IOC控制反转

IOC控制反转

控制反转:

   把对象的创建交给spring容器来做

      spring容器创建对象的方式

         1、默认是调用默认的构造函数

         2、利用静态工厂方法创建

             spring调用工厂方法产生对象,但是真正创建对象还是由程序员来完成的

         3、实例工厂方法

        说明:

           spring配置文件中,只要是一个bean就会为该bean创建对象

      spring容器创建对象的时机

        在单例的情况下

         1、在默认的情况下,启动spring容器创建对象

         2、在spring的配置文件bean中有一个属性lazy-init="default/true/false"

               1、如果lazy-init为"default/false"在启动spring容器时创建对象

               2、如果lazy-init为"true",在context.getBean时才要创建对象

           意义:

                在第一种情况下可以在启动spring容器的时候,检查spring容器配置文件的正确性,如果再结合tomcat,

                如果spring容器不能正常启动,整个tomcat就不能正常启动。但是这样的缺点是把一些bean过早的放在了

                内存中,如果有数据,则对内存来是一个消耗

                在第二种情况下,可以减少内存的消耗,但是不容易发现错误

        在多例的情况下

            就是一种情况:在context.getBean时才创建对象

      spring的bean中的scope

        1、由spring产生的bean默认是单例的

        2、可以在spring的配置文件中,scope的值进行修改="singleton/prototype/request/session/global session"

        3、如果spring的配置文件的scope为"prototype",则在得到该bean时才创建对象

      spring容器对象的生命周期:

        1、spring容器创建对象

        2、执行init方法

        3、调用自己的方法

        4、当spring容器关闭的时候执行destroy方法

                                 ClassPathXmlApplicationContext.destroy()或者ClassPathXmlApplicationContext.destroy()

  当scope为"prototype"时,spring容器是否调用destroy方法?

        

首先

applicationContext.xml下

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans
 5            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
 6     <import
 7         resource="cn/itcast/spring/sh/ioc/createobject/applicationContext-createobject.xml" />
 8     <import resource="cn/itcast/spring/sh/ioc/alias/applicationContext-alias.xml" />
 9     
10     <import resource="cn/itcast/spring/sh/createobject/method/applicationContext-createobject-method.xml" />
11     
12 <!--     <import resource="cn/itcast/spring/sh/createobject/when/applicationContext-createobejct-when.xml" /> -->
13     
14 <!--     <import resource="cn/itcast/spring/sh/scope/applicationContext-scope.xml" /> -->
15     
16 <!--     <import resource="cn/itcast/spring/sh/initdestroy/applicationContext-initdestroy.xml" /> -->
17     
18 <!--     <import resource="cn/itcast/spring/sh/di/set/applicationContext-di-set.xml" /> -->
19     
20 <!--     <import resource="cn/itcast/spring/sh/di/constructor/applicationContext-di-constructor.xml" /> -->
21     
22 <!--     <import resource="cn/itcast/spring/sh/document/applicationContext-document.xml" /> -->
23 
24 <!--     <import resource="cn/itcast/spring/sh/mvc/applicationContext-mvc.xml"/> -->
25 </beans>
View Code

spring创建对象的几种方式:

1.bean默认构造函数 以及别名的使用

cn.itcast.spring.sh.ioc.alias包下

 1 package cn.itcast.spring.sh.ioc.alias;
 2 
 3 public class HelloWorld {
 4     public HelloWorld(){
 5         System.out.println("new instance");
 6     }
 7     public void hello(){
 8         System.out.println("hello");
 9     }
10 }
View Code

applicationContext-alias.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xsi:schemaLocation="http://www.springframework.org/schema/beans
 5            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
 6       <bean id="helloWorld_Alias" class="cn.itcast.spring.sh.ioc.alias.HelloWorld"></bean>
 7       <!-- 
 8           name的属性和bean的id对应
 9        -->
10       <alias name="helloWorld_Alias" alias="王二麻子"/>
11 </beans>

测试:

 1     @Test
 2     public void testAlias(){
 3         /**
 4          * 别名
 5          * 1、启动spring容器
 6          * 2、从spring容器中把对象取出来
 7          * 3、对象调用方法
 8          */
 9         ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
10         cn.itcast.spring.sh.ioc.alias.HelloWorld helloWorld = (cn.itcast.spring.sh.ioc.alias.HelloWorld)context.getBean("王二麻子");
    //当然可以用beanid创建
    //
cn.itcast.spring.sh.ioc.alias.HelloWorld helloWorld = (cn.itcast.spring.sh.ioc.alias.HelloWorld)context.g    //etBean("helloWorld_Alias");
11         helloWorld.hello();
12     }
13     

2.静态工厂方法

 1 package cn.itcast.spring.sh.createobject.method;
 2 
 3 public class HelloWorld {
 4     public HelloWorld(){
 5         System.out.println("new instance");
 6     }
 7     public void hello(){
 8         System.out.println("hello");
 9     }
10 }

 

1 package cn.itcast.spring.sh.createobject.method;
2 
3 public class HelloWorldFactory {
4     public static HelloWorld getInstance(){
5         return new HelloWorld();
6     }
7 
8 }

applicationContext-createobject-method.xml

 

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xsi:schemaLocation="http://www.springframework.org/schema/beans
 5            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
 6       <bean id="helloWorld_C_M" class="cn.itcast.spring.sh.createobject.method.HelloWorld" ></bean>
 7       <!-- 
 8           factory-method
 9             工厂方法
10        -->
11 <!--            利用静态工程方法 自动调用其构造的方法,主程序通过(HelloWorld)context.getBean("helloFactory")调用,返回HelloWorld对象 -->
12     <bean id="helloFactory" class="cn.itcast.spring.sh.createobject.method.HelloWorldFactory" factory-method="getInstance"></bean>
13     
14 
15 </beans>

测试

 1     public void testCreateObjectMethod_StaticFactory(){
 2         /**
 3          * 1、启动spring容器
 4          * 2、从spring容器中把对象取出来
 5          * 3、对象调用方法
 6          */
 7         ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
 8         HelloWorld factory = (HelloWorld)context.getBean("helloFactory");
 9         factory.hello();
10     }

 

3.实例工厂方法

HelloWorld.java

 1 package cn.itcast.spring.sh.createobject.method;
 2 
 3 public class HelloWorld {
 4     public HelloWorld(){
 5         System.out.println("new instance");
 6     }
 7     public void hello(){
 8         System.out.println("hello");
 9     }
10 }

 

 1 package cn.itcast.spring.sh.createobject.method;
 2 
 3 public class HelloWorldFactory {
 4     public static HelloWorld getInstance(){      //用于静态工程方法
 5         return new HelloWorld();
 6     }
 7     
 8     public HelloWorld getIns(){          //用于实例工厂方法
 9         return new HelloWorld();
10     }
11 }

applicationContext-createobject-method.xml

 

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xsi:schemaLocation="http://www.springframework.org/schema/beans
 5            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
 6       <bean id="helloWorld_C_M" class="cn.itcast.spring.sh.createobject.method.HelloWorld" ></bean>
 7       <!-- 
 8           factory-method
 9             工厂方法
10        -->
11 <!--            利用静态工程方法 自动调用其构造的方法,主程序通过(HelloWorld)context.getBean("helloFactory")调用,返回HelloWorld对象 -->
12 <!--     <bean id="helloFactory" class="cn.itcast.spring.sh.createobject.method.HelloWorldFactory" factory-method="getInstance"></bean> -->
13     
14 <!--     实例工程调用范围 -->
15     
16     <bean id="helloFactory" class="cn.itcast.spring.sh.createobject.method.HelloWorldFactory" ></bean>
17 <!--         这种调用方式就是非静态了,先实例工厂对象通过factory-bean注入,然后 调用getIns方法主程序HelloWorld factory = (HelloWorld)context.getBean("aa"); -->
18     <bean id="aa" factory-bean="helloFactory" factory-method="getIns"></bean>
19 </beans>

测试

 1     @Test
 2     public void testCreateObjectMethod_Factory(){
 3         /**
 4          * 1、启动spring容器
 5          * 2、从spring容器中把对象取出来
 6          * 3、对象调用方法
 7          */
 8         ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
 9         HelloWorld factory = (HelloWorld)context.getBean("aa");
10         factory.hello();
11     }