spring的IOC 容器管理 Bean详解编程语言

Bean 实例化的方式:
1.使用类构造器创建Bean实例
2.提供静态工厂方法创建Bean实例
3.提供实例工厂方法创建Bean实例

代码示例:
Bean1.java

package com.my.ioc_bean; 
 
// 第一种  构造器 
public class Bean1 { 
 
} 

Bean2.java

package com.my.ioc_bean; 
 
//第二种 静态工厂方法 
public class Bean2 { 
 
} 

Bean2Factory.java

package com.my.ioc_bean; 
 
//工厂类 
public class Bean2Factory { 
    // 提供一个静态方法,获得Bean2 的对象 
    // 工厂方法主要用于 Bean 构造非常复杂 
    public static Bean2 createBean2(){ 
        System.out.println("静态工厂执行 ..."); 
        return new Bean2(); 
    } 
} 

Bean3.java

package com.my.ioc_bean; 
 
public class Bean3 { 
 
} 

Bean4.java

package com.my.ioc_bean; 
 
// 第三种 实例工厂方法 
public class Bean4 { 
    // 提供方法 获得Bean3  
    public Bean3 getBean3(){ 
        return new Bean3(); 
    } 
} 

SpringTest.java

package com.my.ioc_bean; 
 
import org.junit.Test; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
 
//测试 Bean实例化 三种方式 
public class SpringTest { 
    @Test 
    public void demo1(){ 
        // 创建容器环境 
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); 
        // 获得Bean对象 
        Bean1 bean1 = (Bean1) applicationContext.getBean("bean1"); 
        System.out.println(bean1); 
 
        Bean2 bean2 = (Bean2) applicationContext.getBean("bean2"); 
        System.out.println(bean2); 
 
        Bean3 bean3 = (Bean3) applicationContext.getBean("bean3"); 
        System.out.println(bean3); 
    } 
} 

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:p = "http://www.springframework.org/schema/p" 
       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"> 
 
    <!-- Bean实例化方式 --> 
    <!-- 第一种 构造器 --> 
    <bean id="bean1" class="com.my.ioc_bean.Bean1"></bean> 
    <!-- 第二种 配置静态工厂方法 --> 
    <bean id="bean2" class="com.my.ioc_bean.Bean2Factory" factory-method="createBean2"></bean> 
    <!-- 第三种 实例工厂方法 --> 
    <bean id="bean4" class="com.my.ioc_bean.Bean4"></bean> 
    <!-- bean3对象 通过 bean4对象 提供 getBean3方法 获得  --> 
    <bean id="bean3" factory-bean="bean4" factory-method="getBean3"></bean> 
 
</beans>

运行结果:
这里写图片描述

Bean的作用域
singleton 单例
prototype 原型(多个实例)
主要用于web开发
request 将Bean保存request对象中 request.setAttribute
session 将Bean 保存session对象中 session.setAttribute
globalSession 全局Session (分布式系统 )

企业开发时:最常用 singleton 和 prototype
SingletonBean 在容器初始化时,就构造
PrototypeBean 在使用Bean (getBean) 才去构造

代码示例:
SingletonBean.java

package com.my.scope; 
 
//单例Bean 
public class SingletonBean { 
    public SingletonBean() { 
        System.out.println("单例Bean ..."); 
    } 
}

PrototypeBean.java

package com.my.scope; 
 
//原型Bean 
public class PrototypeBean { 
    public PrototypeBean() { 
        System.out.println("原型Bean..."); 
    } 
}

Test.java

package com.my.scope; 
 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
 
public class Test { 
 
    @org.junit.Test 
    public void demo(){ 
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); 
        SingletonBean singletonBean1 = (SingletonBean) applicationContext.getBean("singletonBean"); 
        SingletonBean singletonBean2 = (SingletonBean) applicationContext.getBean("singletonBean"); 
        System.out.println(singletonBean1); 
        System.out.println(singletonBean2); 
 
        PrototypeBean prototypeBean1 = (PrototypeBean) applicationContext.getBean("prototypeBean"); 
        PrototypeBean prototypeBean2 = (PrototypeBean) applicationContext.getBean("prototypeBean"); 
        System.out.println(prototypeBean1); 
        System.out.println(prototypeBean2); 
    } 
 
} 

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:p = "http://www.springframework.org/schema/p" 
       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"> 
 
    <!-- Bean的作用域 --> 
    <!-- 如果没写scope 默认 singleton --> 
    <bean id="singletonBean" class="com.my.scope.SingletonBean"></bean> 
    <bean id="prototypeBean" class="com.my.scope.PrototypeBean" scope="prototype"></bean> 
 
</beans>

运行结果:
这里写图片描述

Bean的初始化和销毁
在配置<bean>元素时,为bean 指定初始化和销毁的方法 的
init-method 指定初始化方法
destroy-method 指定销毁方法

初始化和销毁方法,是void返回值,非static 方法 ,不要传递参数 !!!
销毁手动调用容器close

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); 
applicationContext.close();

企业程序存在init方法,不是构造方法
原因: 不建议在构造器中写大量代码逻辑 ,而把这些逻辑写入到初始化方法中 !

代码示例:
LifeBean.java

package com.my.life; 
 
//初始化和销毁  
public class LifeBean { 
    public LifeBean() { 
        System.out.println("LifeBean 被构造..."); 
    } 
 
    public void setup(){ 
        System.out.println("LifeBean初始化..."); 
    } 
 
    public void teardown(){ 
        System.out.println("LifeBean销毁..."); 
    } 
}    
 

Test.java

package com.my.life; 
 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
 
 
public class Test { 
 
    @org.junit.Test 
    public void test() { 
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); 
        System.out.println(applicationContext.getBean("lifeBean")); 
        // 只有当容器关闭时,才会执行Bean销毁方法 
        // 执行容器close方法 
        applicationContext.close(); 
    } 
 
} 

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:p = "http://www.springframework.org/schema/p" 
       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"> 
 
    <!-- Bean的初始化和销毁方法 --> 
    <bean id="lifeBean" class="com.my.life.LifeBean" init-method="setup" destroy-method="teardown"/> 
 
</beans>

运行结果:
这里写图片描述

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/12103.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论