赞
踩
<?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="sb" class="com.gdb.spring6.beans.SpringBean" scope="prototype" />
</beans>
package com.gdb.spring6.bean;
public class Vip {
}
package com.gdb.spring6.bean;
public class VipFactory {
public static Vip get(){
return new Vip();
}
}
<bean id="vipBean" class="com.gdb.spring6.bean.VipFactory" factory-method="get"/>
package com.gdb.spring6.bean;
public class Vip {
}
package com.gdb.spring6.bean;
public class VipFactory {
public Vip get(){
return new Vip();
}
}
<bean id="vipFactory" class="com.gdb.spring6.bean.VipFactory"/>
<bean id="vipBean" factory-bean="vipFactory" factory-method="get"/>
package com.gdb.spring6.bean;
public class Vip {
}
package com.gdb.spring6.bean; import org.springframework.beans.factory.FactoryBean; public class VipFactoryBean implements FactoryBean<Vip> { @Override public Vip getObject() throws Exception { return new Vip (); } @Override public Class<?> getObjectType() { return null; } @Override public boolean isSingleton() { // true表示单例 // false表示原型 return true; } }
<bean id="vipBean" class="com.gdb.spring6.bean.VipFactoryBean"/>
辅助Spring
实例化其它Bean对象的一个Bean。package com.gdb.spring6.bean; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; public class LogBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("Bean后处理器的before方法执行,即将开始初始化"); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("Bean后处理器的after方法执行,已完成初始化"); return bean; } }
<!--配置Bean后处理器。这个后处理器将作用于当前配置文件中所有的bean。-->
<bean class="com.powernode.spring6.bean.LogBeanPostProcessor"/>
在spring.xml文件中配置的Bean后处理器将作用于当前配置文件中所有的Bean。
对于 prototype 作用域Spring容器管理 Bean生命周期的前八步。
package com.gdb.spring6.test; import com.gdb.spring6.bean.User; import org.junit.Test; import org.springframework.beans.factory.support.DefaultListableBeanFactory; public class RegisterBeanTest { @Test public void testBeanRegister(){ // 自己new的对象 User user = new User(); System.out.println(user); // 创建 默认可列表BeanFactory 对象 DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); // 注册Bean factory.registerSingleton("userBean", user); // 从spring容器中获取bean User userBean = factory.getBean("userBean", User.class); System.out.println(userBean); } }
实例化对象和对象的属性赋值分为两个阶段来完成的。
BeanCurrentlyInCreationException
异常。
Spring只能解决setter方法注入的单例bean之间的循环依赖。ClassA依赖ClassB,ClassB又依赖ClassA,形成依赖闭环。Spring在创建ClassA对象后,不需要等给属性赋值,直接将其曝光到bean缓存当中。在解析ClassA的属性时,又发现依赖于ClassB,再次去获取ClassB,当解析ClassB的属性时,又发现需要ClassA的属性,但此时的ClassA已经被提前曝光加入了正在创建的bean的缓存中,则无需创建新的的ClassA的实例,直接从缓存中获取即可。从而解决循环依赖问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。