1.使用@Configuration配置容器
//MySpringConfig.java
@Configuration //等同于配置的spring配置文件
@Lazy//默认开启懒加载(True)
public class MySpringConfig {
@Bean
public User user() {
return new User(10, "小明");
}
}
2.使用注解形式加载IOC
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MySpringConfig.class);
User user = applicationContext.getBean("user", User.class);
System.out.println(user.toString());
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (int i = 0; i < beanDefinitionNames.length; i++) {
System.out.println(beanDefinitionNames[i]);
}
}
3.使用@ComponentScan扫包注入IOC容器
@ComponentScan("扫包范围")
@ComponentScan中includeFilters属性(包含)和excludeFilter属性(排除)
@ComponentScan(value = "扫包范围", includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Controller.class)}, useDefaultFilters = false)
FilterType有五种类型:1.ANNOTATION(注解类型)2.ASSIGNABLE_TYPE:ANNOTATION(指定类型)3.ASPECTJ(按照Aspectj的表达式)4.REGEX(按照正则表达式)5.CUSTOM(自定义)
4.@Condition条件注入Bean
Condition是在Spring4.0增加的条件注解,可以选择性注入Bean。
实现Condition接口及其条件方法,然后再通过@Condition注解条件注入Bean。
5.@Import方式注入Bean
@Import是被用来整合所有在@Configuration注解中定义的Bean配置
6.ImportSelector接口
ImportSelector接口是至spring中导入外部配置的核心接口,在SpringBoot的自动化配置和@EnableXXX(功能性注解)都有它的存在。
public class MyImportSelector implements ImportSelector {
/**
* AnnotationMetadata 注解信息
*
* @param importingClassMetadata
* @return
*/
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
// 添加需要注册的spring容器的类
return new String[]{"com.service.UserService"};
}
}
//然后通过以上多种方式注入Bean中,例如@Import(MyImportSelector.class)、@Bean
7.ImportBeanDefinitionRegistrar手动注入Bean
实现ImportBeanDefinitionRegistrar接口及其方法
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
// 手动注册bean
String beanName = "payEntity";
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(PayEntity.class);
registry.registerBeanDefinition(beanName, rootBeanDefinition);
}
}
8.使用FactoryBean注册对象
public class MyFactoryBean implements FactoryBean<MemberEntity> {
public MemberEntity getObject() throws Exception {
return new MemberEntity();
}
public Class<?> getObjectType() {
return MemberEntity.class;
}
public boolean isSingleton() {
return false;
}
}
//然后通过以上多种方式注入Bean中,例如@Import(MyFactoryBean.class)、@Bean
9.BeanFactory和FactoryBean区别
BeanFactory:是用于注入Bean对象
FactoryBean:用于获取Bean对象
BeanFactory是个Factory,也就是IOC容器或对象工厂,FactoryBean是个Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。但对FactoryBean而言,是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似。