Spring(二)Spring Bean管理
作者:互联网
Spring工厂类(续)
这里对上节 Spring工厂类中的BeanFactory和ApplicationContext进行补充
两者在生成bean实例的时机是不一样的,前者是在工厂实例化之后,在调用getBean的时候才会帮我们去创建这个类的实例,而后者是一加载配置文件,就会将配置文件中单例模式生成的类
全部实例化。
Spring Bean管理(XML方式)
首先我们要知道三种实例化Bean的方式
- 使用类构造器实例化(默认无参数)
- 使用静态工厂方法实例化(简单工厂模式)
- 使用实例工厂方法实例化(工厂方法模式)
接下来我们看看配置文件中一行代码
<bean id="bean1" class="com.imooc.ioc.demo2.Bean1"/>
bean的配置:
id:一般情况下,装配一个Bean时,通过指定一 个id属性作为Bean的名称,id属性在IOC容器中必须是唯一的
name: 如果Bean的名称中含有特殊字符,就需要使用name属性
class: class用于设置一个类的完全路径名称,主要作用是IOC容器生成类的实例
Bean的作用域
对于这个作用域我们和Bean的实例化方式我们用一个案例来说明
同样的我们建立一个Maven项目,引入jar包,这些在上一节有讲我们不多说(在下边贴出引入jar包的代码),还是得有一个applicationContext.xml的配置文件,我们先进行无参构造器实例化Bean
在com.MtLi下新建demo2包,再创建Bean1类和SpringDemo2类
Bean1:
package com.MtLi.demo2;
/**
* Bean的实例化的三种方式:采用无参数的构造方法的方式
*/
public class Bean1 {
public Bean1(){//构造函数初始化
System.out.println("Bean1被实例化了...");
}
}
然后我们配置一下applicationContext.xml
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">
<!--UserService的创建权交给了Spring-->
<!--<bean id="userService" class="com.MtLi.demo1.UserServiceImpl">-->
<!--<!–设置属性–>-->
<!--<property name="name" value="李四"/>-->
<!--</bean>-->
<!--Bean的实例化的三种方式-->
<!--第一种:无参构造器的方式-->
<bean id="bean1" class="com.MtLi.demo2.Bean1"/>
在这里面我们给定该bean的名称为bean1,以及对应的类路径,然后我们在SpringDemo2里面进行测试
SpringDemo2:
package com.MtLi.demo2;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 测试Bean的实例化的三种方式
*/
public class SpringDemo2 {
@Test
public void demo1(){
//创建工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过工厂获得类的实例:
Bean1 bean1 = (Bean1)applicationContext.getBean("bean1");
}
}
//运行结果
Bean1被实例化了...
看到这个结果,说明调用了构造方法
接下来,我们再来看看第二种方式——使用静态工厂方法实例化
我们同样的在com.MtLi.demo2下面新建Bean2,还要新建Bean2Factory类(我们需要对Bean2提供一个静态工厂,即提供一个静态方法)
Bean2:
package com.MtLi.demo2;
/**
* Bean的实例化的三种方式:静态工厂实例化方式
*/
public class Bean2 {
}
//里面什么都不需要加
Bean2Factory:
package com.MtLi.demo2;
/**
* Bean2的静态工厂
*/
public class Bean2Factory {
public static Bean2 creatBean2(){
//添加静态方法
System.out.println("Bean2Factory的方法已经执行...");
return new Bean2();
}
}
然后修改配置文件
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">
<!--UserService的创建权交给了Spring-->
<!--<bean id="userService" class="com.MtLi.demo1.UserServiceImpl">-->
<!--<!–设置属性–>-->
<!--<property name="name" value="李四"/>-->
<!--</bean>-->
<!--Bean的实例化的三种方式-->
<!--第一种:无参构造器的方式-->
<!--<bean id="bean1" class="com.MtLi.demo2.Bean1"/>-->
<!--第二种:静态工厂的方式-->
<bean id="bean2" class="com.MtLi.demo2.Bean2Factory" factory-method="creatBean2"/>
这里路径是对应的实例类(Bean2的静态工厂),我们需要指定它的静态方法,这里用到"factory-method"标签,然后我们进行测试
SpringDemo2:
package com.MtLi.demo2;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 测试Bean的实例化的三种方式
*/
public class SpringDemo2 {
// @Test
// public void demo1(){
// //创建工厂
// ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// //通过工厂获得类的实例:
// Bean1 bean1 = (Bean1)applicationContext.getBean("bean1");
// }
@Test
public void demo2(){
//创建工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过工厂获得类的实例:
Bean2 bean2 = (Bean2)applicationContext.getBean("bean2");
}
}
//运行结果
Bean2Factory的方法已经执行...
接下来是使用实例工厂方法实例化
我们新建Bean3类和Bean3Factory类
Bean3:
package com.MtLi.demo2;
/**
* Bean的实例化三种方式:实例工厂实例化
*/
public class Bean3 {
}
//里面什么都不需要加
Bean3Factory:
package com.MtLi.demo2;
/**
* Bean3的实例工厂
*/
public class Bean3Factory {
public Bean3 createBean3(){
//和静态工厂主要的区别就是方法不是静态的
System.out.println("Bean3Factory的方法已经执行...");
return new 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">
<!--UserService的创建权交给了Spring-->
<!--<bean id="userService" class="com.MtLi.demo1.UserServiceImpl">-->
<!--<!–设置属性–>-->
<!--<property name="name" value="李四"/>-->
<!--</bean>-->
<!--Bean的实例化的三种方式-->
<!--第一种:无参构造器的方式-->
<!--<bean id="bean1" class="com.MtLi.demo2.Bean1"/>-->
<!--第二种:静态工厂的方式-->
<!--<bean id="bean2" class="com.MtLi.demo2.Bean2Factory" factory-method="creatBean2"/>-->
<!--第三种:实例工厂的方式-->
<!--非静态需要先写工厂的实例-->
<bean id="bean3Factory" class="com.MtLi.demo2.Bean3Factory"/>
<bean id="bean3" factory-bean="bean3Factory" factory-method="createBean3"/>
非静态和静态的配置不相同,静态可以直接指定方法,指定工厂类路径,但是非静态需要先有工厂的实例,然后再配置方法,需要指定工厂bean为工厂实例的bean名称(指明该方法的属向)
然后我们进行测试
SpringDemo2:
package com.MtLi.demo2;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 测试Bean的实例化的三种方式
*/
public class SpringDemo2 {
// @Test
// public void demo1(){
// //创建工厂
// ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// //通过工厂获得类的实例:
// Bean1 bean1 = (Bean1)applicationContext.getBean("bean1");
// }
// @Test
// public void demo2(){
// //创建工厂
// ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// //通过工厂获得类的实例:
// Bean2 bean2 = (Bean2)applicationContext.getBean("bean2");
// }
@Test
public void demo3(){
//创建工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过工厂获得类的实例:
Bean3 bean3 = (Bean3)applicationContext.getBean("bean3");
}
}
//运行结果
Bean3Factory的方法已经执行...
关于Bean的作用域测试(手打中)
标签:applicationContext,管理,Spring,工厂,Bean,实例,Bean2,public 来源: https://blog.csdn.net/weixin_42173451/article/details/99410112