方式一:使用正常的注解
@Component
public class DiscountInfo {}
@Controller、@Service、@repository等,本質跟@Component一樣
public class DiscountInfo {}
@Configuration,,本質跟@Component一樣
public class DiscountInfo {}
//此方式注意,使用@Import注解時,通過容器擷取bean,使用getBean()并不能通過名字去擷取,而是需要使用對應的.class
@Configuration @ComponentScan("com.bboss.business.ecloud.bean")
@Import(DiscountInfo.class)
public class MyConfig {}
方式二:在配置類中使用@Bean
@Configuration
@ComponentScan("com.bboss.business.ecloud.bean")
public class MyConfig {
@Bean
public DiscountInfo discountInfo(){
return new DiscountInfo();
}
}
方式三:使用spring的配置檔案和@ImportResource注解
@Configuration
@ComponentScan("com.bboss.business.ecloud.bean")
@ImportResource("classpath:spring.xml")
public class MyConfig { }
//在resource目錄下:
<?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="discountInfo" class="com.bboss.business.ecloud.bean.DiscountInfo">
</bean>
</beans>
方式四:實作BeanDefinitionRegistryPostProcessor接口來建立bean對象
//BeanDefinition在Spring中是用來描述Bean對象的,其不是一個bean執行個體,僅僅是包含bean執行個體的所有信,比如屬性值、構造器參數以及其他資訊。
//Bean對象建立是根據BeanDefinitionc中描述的資訊來建立的,BeanDefinitionc存在的作用是為了可以友善的進行修改屬性值和其他元資訊。
//比如通過BeanFactoryPostProcessor進行修改一些資訊,然後在建立Bean對象的時候就可以結合原始資訊和修改後的資訊建立對象了。
@Component
public class MyBeanDefinitionPostProcessor implements BeanDefinitionRegistryPostProcessor {
//注冊器
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setBeanClass(DiscountInfo.class);
registry.registerBeanDefinition("discountInfo",beanDefinition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
}
方式五:實作FactoryBean接口重寫方法/SmartFactoryBean接口
@Component
public class MyFactoryBean implements FactoryBean {
@Override
public Object getObject() throws Exception {
return new DiscountInfo();
}
@Override
public Class<?> getObjectType() {
return DiscountInfo.class;
}
}
//此時注意,使用容器擷取bean時,應該使用對應的.class檔案,并且getObjectType()方法傳回的類型必須與上面的getObject()一緻;若想使用名字,應當使用myFactoryBean的名字
//并且對于DiscountInfo這個bean中,注入的bean都不會被注入
//對于FactoryBean接口和SmartFactoryBean接口的差別是:FactoryBean有點懶加載的意思,SmartFactoryBean這個會直接加載
方式六:直接使用上下文進行注冊
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
context.register(DiscountInfo.class);
DiscountInfo discountInfo = context.getBean(DiscountInfo.class);
CheckEcloudVo checkEcloudVo = context.getBean("checkEcloudVo", CheckEcloudVo.class);
System.out.println(discountInfo);
checkEcloudVo.test();
}
方式七:使用上下文中的BeanDefinitionBuilder注冊
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setBeanClass(DiscountInfo.class);
context.registerBeanDefinition("discountInfo",beanDefinition );
DiscountInfo discountInfo = context.getBean(DiscountInfo.class);
CheckEcloudVo checkEcloudVo = context.getBean("checkEcloudVo", CheckEcloudVo.class);
System.out.println(discountInfo);
checkEcloudVo.test();
}
方式八:使用上下文注冊
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
context.registerBean("discountInfo", DiscountInfo.class, new Supplier<DiscountInfo>() {
@Override
public DiscountInfo get() {
return new DiscountInfo();
}
});
DiscountInfo discountInfo = context.getBean(DiscountInfo.class);
CheckEcloudVo checkEcloudVo = context.getBean("checkEcloudVo", CheckEcloudVo.class);
System.out.println(discountInfo);
checkEcloudVo.test();
}
建立bean的方式還有很多,以上隻是舉例了我知道的幾種,歡迎補充!