30个类手写Spring核心原理之依赖注入功能(3),2024年最新十道经典面试题

}

1 从getBean()方法开始


下面我们从完善getBean()方法开始:

@Override

public Object getBean(String beanName) {

GPBeanDefinition beanDefinition = super.beanDefinitionMap.get(beanName);

try{

//生成通知事件

GPBeanPostProcessor beanPostProcessor = new GPBeanPostProcessor();

Object instance = instantiateBean(beanDefinition);

if(null == instance){ return null;}

//在实例初始化以前调用一次

beanPostProcessor.postProcessBeforeInitialization(instance,beanName);

GPBeanWrapper beanWrapper = new GPBeanWrapper(instance);

this.factoryBeanInstanceCache.put(beanName,beanWrapper);

//在实例初始化以后调用一次

beanPostProcessor.postProcessAfterInitialization(instance,beanName);

populateBean(beanName,instance);

//通过这样调用,相当于给我们

必看视频!获取2024年最新Java开发全套学习资料

自己留有了可操作的空间

return this.factoryBeanInstanceCache.get(beanName).getWrappedInstance();

}catch (Exception e){

// e.printStackTrace();

return null;

}

}

2 instantiateBean()方法反射创建实例


//传一个BeanDefinition,就返回一个实例Bean

private Object instantiateBean(GPBeanDefinition beanDefinition){

Object instance = null;

String className = beanDefinition.getBeanClassName();

try{

//因为根据Class才能确定一个类是否有实例

if(this.factoryBeanObjectCache.containsKey(className)){

instance = this.factoryBeanObjectCache.get(className);

}else{

Class<?> clazz = Class.forName(className);

instance = clazz.newInstance();

this.factoryBeanObjectCache.put(beanDefinition.getFactoryBeanName(),instance);

}

return instance;

}catch (Exception e){

e.printStackTrace();

}

return null;

}

3 populateBean()方法完成依赖注入


private void populateBean(String beanName,Object instance){

Class clazz = instance.getClass();

if(!(clazz.isAnnotationPresent(GPController.class) ||

clazz.isAnnotationPresent(GPService.class))){

return;

}

Field [] fields = clazz.getDeclaredFields();

for (Field field : fields) {

if (!field.isAnnotationPresent(GPAutowired.class)){ continue; }

GPAutowired autowired = field.getAnnotation(GPAutowired.class);

String autowiredBeanName = autowired.value().trim();

if(“”.equals(autowiredBeanName)){

autowiredBeanName = field.getType().getName();

}

field.setAccessible(true);

try {

field.set(instance,this.factoryBeanInstanceCache.get(autowiredBeanName). getWrappedInstance());

} catch (IllegalAccessException e) {

// e.printStackTrace();

}

}

}

面试题总结

其它面试题(springboot、mybatis、并发、java中高级面试总结等)

// e.printStackTrace();

}

}

}

面试题总结

其它面试题(springboot、mybatis、并发、java中高级面试总结等)

[外链图片转存中…(img-azOwU9YU-1720155911893)]

[外链图片转存中…(img-j7zAgfjB-1720155911894)]

[外链图片转存中…(img-K6rrPvrr-1720155911894)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值