1、spring中注入的beanId如果重复会怎么样?
答:启动报错,因为beanId和类名是一样的;如果bean的全路径一致,且beanId相同会报错;对于相同类如果想要注入多个bean可修改beanId即可;
2、注解@Configuration作用
答:是将实例类作为配置文件注入spring容器中,等同于spring的xml配置文件;在该类中通过@Bean注解将bean对像注入到容器中;与xml配置中注入bean是通过标签的方法是一样的;[一般这种用法是对外部jar包注入的时候,同部的有其他]
注解模式通过applicationContext= newAnnotationConfigApplicationContext(MySpringConfig.class)spring拿到该配置的上下文,再通过上下文 applicationContext.getBean("userEntity", UserEntity.class);拿到实例类;
xml模式通过applicationContext= newClassPathXmlApplicationContext("applicationContext.xml");拿到配置上下文对像,再通过上下文对像获取bean, applicationContext.getBean("userEntity");
3、 将实例类注入到spring容器中的作用
答:实例类注入到spring容器中,通过spring的IOC来管理对像的创建与使用;
4、注解@ComponentScan
答:spring中其他可以注入IOC的注解有,@Service,@Controller,@Repository,底层都是@Component,加上这些注解通再通过@ComponentScan扫包,在启动的时候就会将该类注入到springIOC中;
includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Controller.class)}要扫的注解;其他不注入
excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Controller.class)}排除要扫的注解;其他注入
5、怎么查看springIOC中有那些bean对像?
答:String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();在spring容器中通过上下文的getBeanDefinitionNames方法拿到IOC容器中的bean对像名称,注意是名称;
6、spring容器中的对像默认情况下是单例还是多例?注解@Scope作用
答:spring中的数据默认情况下是单例;可以通过注解@Scope修改为多例;参数如下
singleton单例模式【默认】
prototype原型模式:每次获取Bean的时候都会有一个新的实例。
request:表示针对每次请求都会产生一个新的Bean对象,并且该Bean对象仅在当前Http请求内有效。
session:作用域表示煤气请求都会产生一个新的Bean对象,并且该Bean仅在当前Http session内有效
7、springIOC中的bean是什么时候创建的?
答:有2种方式,第1种是调用的时候创建,第2种是配置文件加载的时候创建;默认是饿汉式,启动的时候就创建注入IOC中;可以通过@Lazy注解来改变创建的方式,当默认@Lazy(true)是,表示懒加载,调用的时候创建;@Lazy(false),启动就加载创建;不用该注解,则是饿汉式,加载即创建;
8、@Bean与@Import注解区别?
答:都是将第3方的jar包中的bean对像注入spring容器中,而@Bean通过new 对像注入,当多个对像的时候就会有代码冗余,而@Import可一次注入多个对像@Import({Apple.class, Banana.class, BerryImportSelector.class, TomatoRegistrar.class}),getBeanDefinitionNames获取时@Import注入的要通过全路径类名获取,@Bean注入的可直接通过Bean名称获取;在springBoot中整全第3方jar包的注解@Enable**的都是通过import封装注入IOC中的;
9、ImportSelector导入选择器
答:除了用注解@Import导入,还可以用使ImportSelector的API进行注入IOC
public class MyImportSelector implementsImportSelector {/*** AnnotationMetadata 注解信息
*@paramimportingClassMetadata
*@return
*/
publicString[] selectImports(AnnotationMetadata importingClassMetadata) {//添加需要注册的spring容器的类
return new String[]{"com.mayikt.v4.V7UserEntity"};
}
}
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(MyImportSelector.class)public @interfaceEnableUser {
}
10、ImportBeanDefinitionRegistrar手动注册Bean
public class MyImportBeanDefinitionRegistrar implementsImportBeanDefinitionRegistrar {public voidregisterBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {//手动注册bean
String beanName = "payEntity";
RootBeanDefinition rootBeanDefinition= new RootBeanDefinition(PayEntity.class);
registry.registerBeanDefinition(beanName, rootBeanDefinition);
}
}
11、FactoryBean与BeanFactory的区别?
答:FactoryBean是往IOC中注册Bean对像,而BeanFactory是从IOC中获取Bean对像;
12、@Primary与@Qualifier的区别?
答:@Primary是优先级最高,当一个接口有多个实现,且都注入了容器中,这个时候用@Autowired使用的时候会报错;这个时候可以用@Qualifier指定使用那个实现;也可以在实现类中使用@Primary,当多个的时候默认获取加@Primary的实现类