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