目录
六、BeanFactory代码演示
七、实例化Bean的两种方式
六、BeanFactory代码演示
上面的案例代码就是我们平时使用Spring Framework的代码。
为了让小伙伴们能感受到BeanFactory,我们还是用实际代码来进行演示一下。毕竟 ApplicationContext在牛,对于BeanFactory来说,它也只是个孩子。
1.复习Junit4和Junit Jupiter
上面的代码是直接在src/main/java下新建一个类,并在主方法中完成的代码测试。实际上Maven是支持单元测试的,可以在src/main/test下使用测试类进行测试,比较方便。
我们先来回顾下Junit 4 和 Junit jupiter
1、Junit 4,流行时间比较长,Java中常见的单元测试工具。
2、Junit Jupiter,其实就是所谓的Junit 5,只是没有叫Junit 5,而是叫Junit Jupiter。Spring 最近几个 版本默认使用的就是Jupiter(直译:木星)。
使用两个测试工具主要区别是导入的依赖不同,在单元测试方法上添加的都是@Test注解,不同版本 @Test的包不一样。
Junit4的依赖和代码示例
pom.xml
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
代码示例
package com.tong.test;
import org.junit.Test;
public class SpringTest {
/*
单元测试方法必须满足:
@Test包:org.junit.Test
访问权限修饰符:public,其它运行报错
返回值:void,其他运行报错
方法名:随意
参数:无参,其他运行报错
*/
@Test
public void test(){
// 单元测试代码
}
}
Junit Jupiter的依赖和代码示例
pom.xml
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.2</version>
<scope>test</scope>
</dependency>
代码示例
package com.tong.test;
import org.junit.jupiter.api.Test;
public class SpringTest {
/*
@Test:org.junit.jupiter.api.Test;
访问权限修饰符:public/protected/default都可以。private后IDEA不出现运行异常了。推荐:
default
返回值:应该是void。其他类型不报异常,但是没有效果。
方法名称:随意。
参数:不应该有参数。
*/
@Test
void test(){
// 单元测试代码
}
}
2. BeanFactory代码演示
BeanFactory的代码相对ApplicationContext的代码要复杂一点。
想要写出BeanFactory必须要加注下面几个类。
代码示例:
package com.tong.test;
import com.tong.pojo.People;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.core.io.FileSystemResource;
public class SpringTest {
@Test
void testBeanFactory(){
DefaultListableBeanFactory defaultListableBeanFactory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(defaultListableBeanFactory);
xmlBeanDefinitionReader.loadBeanDefinitions(new FileSystemResource("D:\\idea\\idea2022ws\\summer\\src\\main\\resources\\applicationContext.xml"));
People peo = defaultListableBeanFactory.getBean("peo", People.class);
System.out.println(peo);
}
}
七、实例化Bean的两种方式
在Spring中实例化(Instantiation)Bean有两种方式:
1、通过构造方法进行实例化。默认使用无参构造。这种方式和以前new的方式是等效的。上面的第一 个Spring项目其实就是这种,只需要在XML中通过 的class属性指定类的全限定路径,然后 就可以实例化对象。其实构造方法实例化方式又可以细分为无参构造方式和有参构造方式。本小节 只说无参构造方式,有参构造方式放在DI两种方式中进行讲解。
2、通过工厂进行实例化。可以通过静态工厂和实例工厂进行实例化。这种方式完全是根据设计模式中 工厂模式的思想而研发出的。Spring考虑到如果需要频繁实例化某个类的对象,工厂模式无疑是一 个好选择。
1.构造方法实例化
在People类中无参构造方法输出语句。
public People() {
System.out.println("这是People的无参构造方法");
}
测试效果,发现会调用构造方法
2.使用实例工厂实例化bean
2.1 创建工厂类
实例工厂方式需要实例化工厂类。所以工厂中创建bean的方法是一个实例方法。
在项目中创建实例工厂类,并编写方法返回创建的实例对象。
示例中创建com.bjsxt.factory.PeopleFactory
package com.tong.factory;
import com.tong.pojo.People;
/*
实例工厂:工厂类需要实例化。
PeopleFactory factory = new PeopleFactory();
People peo = factory.newInstance();
*/
public class PeopleFactory {
// 在全局实例化一个People对象?无所谓的。
People peo = new People();
public People newInstance(){
return peo;
// return new People();// 可以的,只是每次都获取到的是一个新的People实例。
}
}
2.2 配置配置文件
在applicationContext.xml中先配置工厂实例,然后通过工厂实例产生自己想要的bean对象。
小提示: 实例工厂方式peo2的 标签没有class属性。
<!-- 创建工厂实例 -->
<bean id="factory" class="com.tong.factory.PeopleFactory"></bean>
<!-- factory-bean:工厂对象的id factory-method:创建当前bean的方法名称 -->
<bean id="peo2" factory-bean="factory" factory-method="newInstance"></bean>
2.3 在测试类中测试效果
运行SpringTest类,发现控制台可以输出People对象信息。
/*
实例工厂方式
*/
@Test
void factory(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
People peo2 = context.getBean("peo2", People.class);
System.out.println(peo2);
}
3. 使用静态工厂实例化bean
3.1 创建工厂类
静态工厂和实例工厂类最主要的区别是,创建bean的方法是static修饰的。 创建静态工厂类:com.tong.factory.PeopleStaticFactory
package com.tong.factory;
import com.tong.pojo.People;
/*
静态工厂:负责生产产品的方法是static的。
People peo = PeopleStaticFactory.newInstance();
*/
public class PeopleStaticFactory {
static People peo = new People();
public static People newInstance(){
return peo;
}
}
3.2 配置配置文件
在applicationContext.xml中配置bean,注意bean标签中属性含义:
1、class:静态工厂类的全限定路径
2、factory-method:静态工厂中创建bean的静态方法。
之所以可以这样配置,是因为Java中静态方法是通过类名直接调用,不需要创建工厂的实例。
<!-- 静态工厂-->
<bean id="peo3" class="com.tong.factory.PeopleStaticFactory" factory-method="newInstance"></bean>
3.3 在测试类中测试效果
运行SpringTest类,发现控制台可以输出People对象信息。
/*
静态工厂方式
*/
@Test
void staticFactory(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
People peo3 = context.getBean("peo3", People.class);
System.out.println(peo3);
}