IOC容器(1)
BeanFactory
ApplicationContext
bean的創(chuàng)建時(shí)期
spring Ioc容器(container)
BeanFactory:Spring最底層的接口,值提供了IOC功能,負(fù)責(zé)創(chuàng)建,組裝,管理bean
在應(yīng)用中薪韩,一般不使用Beanfactory,而推薦使用ApplicationContext(應(yīng)用上下文)
ApplicationContext接口繼承了BeanFactory,除此之外,還提供了AOP集成丹莲,國際化處理,事件傳播尸诽,統(tǒng)一資源價(jià)值等功能
bean的創(chuàng)建時(shí)間
1.BeanFactory需要等到獲取一個(gè)bean的時(shí)候才會(huì)去創(chuàng)建bean ---延遲初始化
2.ApplicationContext在啟動(dòng)spring容器時(shí)就會(huì)創(chuàng)建所有的bean(Web應(yīng)用推薦)甥材。
代碼應(yīng)用
(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)測(cè)試
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 容器幫我們創(chuàng)建的person對(duì)象
//1.使用beanFactory測(cè)試
@Test
void testBeanFactory() throws Exception {
Resource resource = new ClassPathResource("com/keen/container/container.xml");
//我們的最終目的是得到BeanFactory對(duì)象
BeanFactory factory =new XmlBeanFactory(resource);
System.out.println("************************");
Person p = factory.getBean("person",Person.class);
System.out.println(p);
}
/*運(yùn)行結(jié)果:
************************
constractor Person....
com.keen.container.Person@3c0a50da
結(jié)論:BeanFactory有延遲初始化的特點(diǎn),在構(gòu)建Spring容器時(shí)性含,
它不會(huì)立馬去創(chuàng)建容器中的bean對(duì)象洲赵,而是要等到從容器中獲取對(duì)象的時(shí)候,
才去創(chuàng)建對(duì)象商蕴。
*/
//2.使用ApplicationContext測(cè)試
@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);
}
/*運(yùn)行結(jié)果:
constractor Person....
************************
com.keen.container.Person@56a6d5a6
結(jié)論:在創(chuàng)建Spring容器的時(shí)候叠萍,就會(huì)把容器中管理的bean立馬初始化
而不會(huì)等到獲取bean的時(shí)候才去初始化。
*/
}
(4)我們的另外一種測(cè)試方法:Spring測(cè)試
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 //完成設(shè)置和注入容器對(duì)象
private Person person;
//Autowired 注釋不僅可以幫我們注入容器中的對(duì)象, 還可以注入容器對(duì)象
@Autowired
private BeanFactory beanfactory;
@Autowired
private ApplicationContext applicationContext;
@Test
void testSpring() throws Exception {
//默認(rèn)是applicationContext
System.out.println(person);
System.out.println(beanfactory);
System.out.println(applicationContext);
}
}
//注意??:此時(shí)我們的配置文件一定要以「“測(cè)試類的類名”-context.xml」命名P魃獭?凉取!格郁!