BeanFactory和ApplicationContext的区别
ApplicationContext 立即加载,读取完配置文件后立即创建配置文件中的对象
BeanFactory 延迟加载,什么时候根据id获取对象,什么时候才创建对象
三种创建bean的方式
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!-- 把创建对象交给spring管理 -->
<!-- 1.使用bean标签创建 ,使用默认构造函数创建
<bean id="accountServerice" class="com.test.AccountServiceImp"></bean>-->
<!-- 使用普通工厂中的方法创建对象
<bean id="instanceFactory" class="com.test.IntanceFactory"></bean>
<bean id="accountService" factory-bean="instanceFactory"" factory-method="getAccountService"></bean> -->
<!-- 使用工厂中的静态方法 -->
<bean id="accountService" class="com.test.StaticFactory" factory-method="getAccountService"/>
</beans>
/**
* bean的三种创建方式
*/
package com.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 模拟一个表现层,用户调用业务层
* @author Administrator
*
*/
/**
* 获取spring的IOC核心容器
* ApplicationContext的三个常用实现类
* ClassPathXmlApplicationContext:可以加载类路径下的配置文件 常用
* FileSystemXmlApplicationContext:加载任意磁盘下的配置文件,必须有访问权限
* AnnotationConfigApplicationContext:用于读取注解创建容器的
*/
public class Test{
public static void main(String[] args){
//1.获取核心容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//2.根据id获取bean对象
IAccountService as = (IAccountService)ac.getBean("accountService");
System.out.println(as);
}
}
/**
* 创建bean对象的工厂
* Bean 在计算机术语中,含义为可重用组件
* JavaBean,用java语言编写的可重用组件
* JavaBean >实体类
* 具体到项目中,就是service和dao对象
* 第一个:配置一个文件来配置service和dao,配置的内容是唯一标识的权限定内名
* 第二个:通过读取配置文件内容,反射创建对象
*
* 配置文件可以是propertie也可以使xml
*/
class IntanceFactory{
public IAccountService getAccountService(){
return new AccountServiceImp();
}
}
class StaticFactory{
public static IAccountService getAccountService(){
return new AccountServiceImp();
}
}
interface IAccountService{
/**
* 模拟保存账户
*/
public void saveAccount();
}
/**
* 业务层实现类
*/
class AccountServiceImp implements IAccountService{
public void saveAccount(){
System.out.println("save a account");
}
}
Bean的作用范围
singleton 单例
prototype 多例
request 作用于web应用的request范围
session 作用于web应用的session范围
global 作用于集群环境的会话范围
Bean的生命周期
singleton 容器创建时对象出生
容器在,对象在
容器亡,对象亡
prototype 第一次使用对象出生
,使用对象过程中一直活着,垃圾回收器回收
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!-- 把创建对象交给spring管理 -->
<!-- 1.使用bean标签创建 ,使用默认构造函数创建 -->
<bean id="accountService" class="com.test.AccountServiceImp"
scope="singleton" init-method="init" destroy-method="destroy"></bean>
</beans>
/**
* bean生命周期
*/
package com.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 模拟一个表现层,用户调用业务层
* @author Administrator
*
*/
/**
* 获取spring的IOC核心容器
* ApplicationContext的三个常用实现类
* ClassPathXmlApplicationContext:可以加载类路径下的配置文件 常用
* FileSystemXmlApplicationContext:加载任意磁盘下的配置文件,必须有访问权限
* AnnotationConfigApplicationContext:用于读取注解创建容器的
*/
public class Test{
public static void main(String[] args){
//1.获取核心容器对象
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//2.根据id获取bean对象
IAccountService as = (IAccountService)ac.getBean("accountService");
System.out.println(as);
as.saveAccount();
//手动关闭容器
ac.close();
}
}
interface IAccountService{
/**
* 模拟保存账户
*/
public void saveAccount();
}
/**
* 业务层实现类
*/
class AccountServiceImp implements IAccountService{
public AccountServiceImp(){
System.out.println("accountService对象创建了");
}
public void init(){
System.out.println("对象初始化了");
}
public void destroy(){
System.out.println("对象销毁了");
}
public void saveAccount(){
System.out.println("save a account");
}
}
2020-3-24 22:11:24 org.springframework.context.support.AbstractApplicationContext prepareRefresh 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1ef9f1d: display name [org.springframework.context.support.ClassPathXmlApplicationContext@1ef9f1d]; startup date [Tue Mar 24 22:11:24 CST 2020]; root of context hierarchy 2020-3-24 22:11:24 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息: Loading XML bean definitions from class path resource [bean.xml] 2020-3-24 22:11:25 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory 信息: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@1ef9f1d]: org.springframework.beans.factory.support.DefaultListableBeanFactory@1175422 2020-3-24 22:11:25 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1175422: defining beans [accountService]; root of factory hierarchy accountService对象创建了 对象初始化了 com.test.AccountServiceImp@102799c save a account 2020-3-24 22:11:25 org.springframework.context.support.AbstractApplicationContext doClose 信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@1ef9f1d: display name [org.springframework.context.support.ClassPathXmlApplicationContext@1ef9f1d]; startup date [Tue Mar 24 22:11:24 CST 2020]; root of context hierarchy 2020-3-24 22:11:25 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons 信息: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1175422: defining beans [accountService]; root of factory hierarchy 对象销毁了