Spring实践手动注册Bean的几种方式
第一种(ClassPathXmlApplicationContext)
1.此种方式使用传统xml方式启动spring容器(xml里面没有任何配置)
public static void main(String[] args) { ClassPathXmlApplicationContext context = new
ClassPathXmlApplicationContext("spring/spring.xml");
// 获取spring bean 工厂 手动注册bean
context.getBeanFactory().registerSingleton("helloWord", new HelloWord());
// 启动spring容器
context.start();
// 从上下文获取bean
HelloWord helloWord = context.getBean("helloWord", HelloWord.class);
System.out.println(helloWord.say());
}
xml内容
<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">
</beans>
第二种(AnnotationConfigApplicationContext)
/** 方法二:AnnotationConfigApplicationContext(Bootstrap.class) **/AnnotationConfigApplicationContext applicationContext1 = new AnnotationConfigApplicationContext(Bootstrap.class);
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) applicationContext1.getBeanFactory();
第三种:继承BeanDefinitionRegistryPostProcessor
1.创建一个DefinitionRegistryPostProcessor
/**@Configuration
或
@Component
或
@Bean定义
**/
@Configuration
public class DefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0)
throws BeansException {
}
/**
* 先执行postProcessBeanDefinitionRegistry方法
* 在执行postProcessBeanFactory方法
*/
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
throws BeansException {
// 第一种 : 手动注入
// 注册bean
registerBean(registry, "hello", HelloWord.class);
registerBean(registry, "helloWord", HelloWord.class);
}
/**
注册bean
**/
private void registerBean(BeanDefinitionRegistry registry, String name, Class<?> beanClass) {
RootBeanDefinition bean = new RootBeanDefinition(beanClass);
registry.registerBeanDefinition(name, bean);
}
}
2.测试能否在spring上下文获取该bean
@SpringBoot" title="SpringBoot">SpringBootApplicationpublic class ApplicationBoot {
public static void main(String[] args) {
ApplicationContext applicationContext = SpringApplication.run(ApplicationBoot.class);
HelloWord helloWord = applicationContext.getBean("hello", HelloWord.class);
System.out.println(helloWord.say());
}
第四种:继承ApplicationContextAware
import org.springframework.beans.BeansException;import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;
public class SpringContextUtils implements ApplicationContextAware {
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
/** 方法一:继承ApplicationContextAware:获得applicationContext **/
// 将applicationContext转换为ConfigurableApplicationContext
ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) applicationContext;
// 获取bean工厂并转换为DefaultListableBeanFactory
DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableApplicationContext.getBeanFactory();
//defaultListableBeanFactory.registerBeanDefinition(beanName, beanDefinition);
}
}
以上是 Spring实践手动注册Bean的几种方式 的全部内容, 来源链接: utcz.com/z/518049.html