1.重写 BeanFactoryAware 接口里面的 setBeanFactory 方法
@Component
public class SpringBeanFactory implements BeanFactoryAware {
public static DefaultListableBeanFactory listableBeanFactory;
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
DefaultListableBeanFactory listableBeanFactory = (DefaultListableBeanFactory)beanFactory;
this.listableBeanFactory = listableBeanFactory;
}
public static void setBean(String beanName,Object object){
//注意这里放入的bean在容器中是单例的
listableBeanFactory.registerSingleton(beanName,object);
}
//根据beanName销毁(删除)单例的bean
public static void removeSingletonBean(String beanName){
listableBeanFactory.destroySingleton(beanName);
}
//手动把对象放入容器中,但是可以设置作用域
public static void setBean(String beanName,Class> clazz){
BeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClassName(clazz.getName());
//设置作用域
beanDefinition.setScope("prototype");
listableBeanFactory.registerBeanDefinition(beanName,beanDefinition);
}
//根据beanName删除使用BeanDefinition创建的bean , Spring默认就是使用BeanDefinition创建的bean对象
public static void removeBean(String beanName){
listableBeanFactory.removeBeanDefinition(beanName);
}
}
2.在其他地方就可以调用该类的静态方法 , 将我们自己创建的对象放入Spring容器中
3.如果想要手动的设置被放入对象的作用域 , 可以使用 BeanDefinition 来实现
//手动把对象放入容器中,但是可以设置作用域
public static void setBean(String beanName,Class>clazz){
BeanDefinition beanDefinition= newRootBeanDefinition();
beanDefinition.setBeanClassName(clazz.getName());//设置作用域
beanDefinition.setScope("prototype");
listableBeanFactory.registerBeanDefinition(beanName,beanDefinition);
}