spring5.0 java_Spring5.0源码分析相关知识点

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的实现类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值