多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # ApplicationContext与BeanFactory关系 ![](https://box.kancloud.cn/45d079ad1b5eb3bf409e66a5dbefdc07_1026x970.png) ApplicationContext它是扩展BeanFactory接口。 **BeanFactory它采取延迟加载的方案,只有真正在getBean时才会实例化Bean** --- 在开发中我们一般使用的是ApplicationContext,真正使用的是其实现类, * FileSystemXmlAppliCationContext 根据文件路径获取 * ClassPathXmlApplicationContext 根据类路径获取 --- AppliCationContext它会在配置文件加载时,就会初始化Bean, 并且ApplicationContext它提供不同的应用层的Context实现。 例如在web开发中可以使用WebApplicationContext. # Bean实例化方式 ## 无参数构造 对于这种方式,注意Bean类中必须提供无参数构造 ~~~ <bean name="user" class="studySpring.User"></bean> ~~~ ## 静态工厂方法 **是静态方法创建** 需要创建一个工厂类,在工厂类中提供一个static返回bean对象的方法就可以 ~~~ <!-- 创建方式2:静态工厂创建 调用UserFactory的createUser方法创建名为user2的对象.放入容器 --> <bean name="user2" class="hello.UserFactory" factory-method="createUser"></bean> ~~~ UserFactory ~~~ public static User createUser() { System.out.println("静态工厂创建User"); return new User(); } ~~~ ## 实例工厂方法 **需要个实例,然后这个实例的方法创建** 需要创建一个工厂类,在工厂类中提供一个非static的创建bean对象的方法,在配置文件中需要将工厂配置,还需要配置bean ~~~ <!-- 创建方式3:实例工厂创建 调用UserFactory对象的createUser2方法创建名为user3的对象.放入容器 --> <bean name="UserFactory" class="hello.UserFactory"></bean> <bean name="user3" factory-bean="UserFactory" factory-method="createUser2"></bean> ~~~ UserFactory ~~~ public User createUser2() { System.out.println("实例工厂创建User"); return new User(); } ~~~ # FactoryBean接口 * **spring中有两种类型的Bean,一种是普通的Bean,另一种是工厂Bean即FactoryBean** * 工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂Bean的getObject方法所返回的对象 ~~~ public interface FactoryBean { //FactoryBean返回的实例 Object getObject() throws Exception; //FactoryBean返回的类型 class getObjectType(); //FactoryBean返回的实例是否为单例 boolean isSingleton(); } ~~~ 例子 FactoryBean类 ~~~ package com.spring; import org.springframework.beans.factory.FactoryBean; public class MyFactoryBean implements FactoryBean<User> { @Override public User getObject() throws Exception { return new User(); } @Override public Class<?> getObjectType() { return User.class; } @Override public boolean isSingleton() { return true; } } ~~~ xml ~~~ <!-- 通过FactoryBean配置Bean --> <bean id="myFactoryBean" class="com.spring.UserFactory"></bean> ~~~ # containsBean("xx")判断容器中有没有这个bean ~~~ boolean b = ctx.containsBean("u"); System.out.println(b); ~~~ # 内部bean 内部bean不能被其他bean引用,所以可以不指定id属性值 ~~~ <!-- 配置内部bean --> <bean id="cartItem2" class="com.jdxia.spring.beans.CartItem"> <property name="book"> <!-- 配置内部bean --> <!-- 内部bean不能被其他bean引用,所以可以不指定id属性值 --> <bean class="com.jdxia.spring.beans.Book"> <property name="id" value="6"></property> <property name="price" value="8.88"></property> <property name="sales" value="6666666"></property> </bean> </property> <property name="count" value="100"></property> <property name="amount" value="1000.00"></property> </bean> ~~~