IOC容器(1)
BeanFactory
ApplicationContext
bean的创建时期
spring Ioc容器(container)
BeanFactory:Spring最底层的接口,值提供了IOC功能,负责创建,组装,管理bean
在应用中,一般不使用Beanfactory,而推荐使用ApplicationContext(应用上下文)
ApplicationContext接口继承了BeanFactory,除此之外,还提供了AOP集成,国际化处理,事件传播,统一资源价值等功能
bean的创建时间
1.BeanFactory需要等到获取一个bean的时候才会去创建bean ---延迟初始化
2.ApplicationContext在启动spring容器时就会创建所有的bean(Web应用推荐)。
代码应用
(1) person类
package com.keen.container;
public class Person {
public Person() {
System.out.println("constractor Person....");
}
}
(2)配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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 id = "person" class ="com.keen.container.Person"/>
</beans>
(3)测试
package com.keen.container;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class ContainerTest {
//目的是得到spring 容器帮我们创建的person对象
//1.使用beanFactory测试
@Test
void testBeanFactory() throws Exception {
Resource resource = new ClassPathResource("com/keen/container/container.xml");
//我们的最终目的是得到BeanFactory对象
BeanFactory factory =new XmlBeanFactory(resource);
System.out.println("************************");
Person p = factory.getBean("person",Person.class);
System.out.println(p);
}
/*运行结果:
************************
constractor Person....
com.keen.container.Person@3c0a50da
结论:BeanFactory有延迟初始化的特点,在构建Spring容器时,
它不会立马去创建容器中的bean对象,而是要等到从容器中获取对象的时候,
才去创建对象。
*/
//2.使用ApplicationContext测试
@Test
void testName() throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("com/keen/container/container.xml");
System.out.println("************************");
Person p = ctx.getBean("person",Person.class);
System.out.println(p);
}
/*运行结果:
constractor Person....
************************
com.keen.container.Person@56a6d5a6
结论:在创建Spring容器的时候,就会把容器中管理的bean立马初始化
而不会等到获取bean的时候才去初始化。
*/
}
(4)我们的另外一种测试方法:Spring测试
package com.keen.container;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
@SpringJUnitConfig
public class ContainerSpringTest {
@Autowired //完成设置和注入容器对象
private Person person;
//Autowired 注释不仅可以帮我们注入容器中的对象, 还可以注入容器对象
@Autowired
private BeanFactory beanfactory;
@Autowired
private ApplicationContext applicationContext;
@Test
void testSpring() throws Exception {
//默认是applicationContext
System.out.println(person);
System.out.println(beanfactory);
System.out.println(applicationContext);
}
}
//注意⚠️:此时我们的配置文件一定要以「“测试类的类名”-context.xml」命名!!!!
网友评论