package com.southeast.ioc.factory;
import com.southeast.BeanPostProcessor;
import com.southeast.ioc.bean.BeanDefinition;
import com.southeast.ioc.bean.BeanReference;
import com.southeast.ioc.bean.PropertyValue;
import com.southeast.ioc.bean.PropertyValues;
import com.southeast.ioc.xml.XmlBeanDefinitionReader;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by 18351 on 2019/1/17.
*/
public class XmlBeanFactory implements BeanFactory{
private Map<String, BeanDefinition> beanDefinitionMap = new HashMap<>();
private List<String> beanDefinitionNames = new ArrayList<>();
// 用来存储注册的BeanPostProcessor
private List<BeanPostProcessor> beanPostProcessors = new ArrayList<>();
private XmlBeanDefinitionReader beanDefinitionReader;
//初始化的时候,自动装配属性
public XmlBeanFactory(String location) throws Exception {
beanDefinitionReader = new XmlBeanDefinitionReader();
loadBeanDefinitions(location);
}
private void loadBeanDefinitions(String location) throws Exception {
beanDefinitionReader.loadBeanDefinitions(location);
registerBeanDefinition();
registerBeanPostProcessor();
}
/**
* 注册BeanDefinition
*/
private void registerBeanDefinition() {
//获取从xml文件中读取到的信息
Map<String, BeanDefinition> map=beanDefinitionReader.getRegistry();
for(String name:map.keySet()){
BeanDefinition beanDefinition=map.get(name);
beanDefinitionMap.put(name,beanDefinition);
beanDefinitionNames.add(name);
}
}
/**
* 注册BeanPostProcessor
*/
public void registerBeanPostProcessor() throws Exception {
List beans = getBeansForType(BeanPostProcessor.class);
for (Object bean : beans) {
addBeanPostProcessor((BeanPostProcessor) bean);
}
}
/**
* 注册BeanPostProcessor
* 1. 根据 BeanDefinition 记录的信息,寻找所有实现了 BeanPostProcessor 接口的类。
* 2. 实例化 BeanPostProcessor 接口的实现类
* 3. 将实例化好的对象放入 List中
*/
public List getBeansForType(Class type) throws Exception {
List beans = new ArrayList<>();
for (String beanDefinitionName : beanDefinitionNames) {
if (type.isAssignableFrom(beanDefinitionMap.get(beanDefinitionName).getBeanClass())) {
beans.add(getBean(beanDefinitionName));
}
}
return beans;
}
//将beanPostProcessor放入容器中
public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
beanPostProcessors.add(beanPostProcessor);
}
/**
* getBean 简化方案
*/
@Override
public Object getBean(String name) throws Exception {
BeanDefinition beanDefinition = beanDefinitionMap.get(name);
if (beanDefinition == null) {
throw new IllegalArgumentException("no this bean with name " + name);
}
//根据beanDefiniton获取Bean
Object bean = beanDefinition.getBean();
if (bean == null) {
//1. 实例化 Bean 对象
//2.将配置文件中配置的属性注入到新创建的 Bean 对象中
//3 .检查 Bean 对象是否实现了 Aware 一类的接口,如果实现了则把相应的依赖设置到 Bean 对象中。
bean = createBean(beanDefinition);
//4. 调用 BeanPostProcessor 前置处理方法,即 postProcessBeforeInitialization(Object bean, String beanName)
//5. 调用 BeanPostProcessor 后置处理方法,即 postProcessAfterInitialization(Object bean, String beanName)
bean = initializeBean(bean, name);
beanDefinition.setBean(bean);
}
return bean;
}
private Object createBean(BeanDefinition bd) throws Exception {
//1. 实例化 Bean 对象
Object bean = bd.getBeanClass().newInstance();
// 2. 将配置文件中配置的属性注入到新创建的 Bean 对象中
applyPropertyValues(bean, bd);
return bean;
}
private void applyPropertyValues(Object bean, BeanDefinition bd) throws Exception {
//3 .检查 Bean 对象是否实现了 Aware 一类的接口,如果实现了则把相应的依赖设置到 Bean 对象中。
if (bean instanceof BeanFactoryAware) {
((BeanFactoryAware) bean).setBeanFactory(this);
}
PropertyValues propertyValues=bd.getPropertyValues();
for (PropertyValue propertyValue : propertyValues.getPropertyValues()) {
Object value = propertyValue.getValue();
if (value instanceof BeanReference) {
BeanReference beanReference = (BeanReference) value;
value = getBean(beanReference.getName());
}
//保证了使用 set方法为对象注入属性
try {
Method declaredMethod = bean.getClass().getDeclaredMethod(
"set" + propertyValue.getName().substring(0, 1).toUpperCase()
+ propertyValue.getName().substring(1), value.getClass());
declaredMethod.setAccessible(true);
//执行 setter方法
declaredMethod.invoke(bean, value);
} catch (NoSuchMethodException e) {
Field declaredField = bean.getClass().getDeclaredField(propertyValue.getName());
declaredField.setAccessible(true);
//创建 setter
declaredField.set(bean, value);
}
}
}
private Object initializeBean(Object bean, String name) throws Exception {
//4. 调用 BeanPostProcessor 前置处理方法,即 postProcessBeforeInitialization(Object bean, String beanName)
for (BeanPostProcessor beanPostProcessor : beanPostProcessors) {
bean = beanPostProcessor.postProcessBeforeInitialization(bean, name);
}
//5. 调用 BeanPostProcessor 后置处理方法,即 postProcessAfterInitialization(Object bean, String beanName)
for (BeanPostProcessor beanPostProcessor : beanPostProcessors) {
bean = beanPostProcessor.postProcessAfterInitialization(bean, name);
}
return bean;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Java面试知识总结.zip (1972个子文件)
CNAME 11B
style.css 6KB
prism-previewers.css 5KB
prism-coy.css 4KB
prism-twilight.css 4KB
prism-solarizedlight.css 3KB
prism.css 2KB
prism-dark.css 2KB
prism-funky.css 2KB
prism-okaidia.css 2KB
prism-tomorrow.css 2KB
prism-toolbar.css 1KB
prism-line-highlight.css 989B
prism-line-numbers.css 806B
prism-command-line.css 683B
prism-show-invisibles.css 456B
prism-unescaped-markup.css 359B
prism-wpd.css 235B
prism-autolinker.css 29B
.editorconfig 209B
.gitattributes 110B
.gitattributes 66B
.gitignore 40B
.gitignore 27B
prism-qore.html 28KB
prism-bro.html 18KB
index.html 16KB
extending.html 12KB
prism-elixir.html 11KB
prism-clojure.html 11KB
index.html 10KB
prism-rest.html 9KB
test-suite.html 9KB
prism-inform7.html 9KB
index.html 8KB
faq.html 7KB
prism-makefile.html 7KB
index.html 7KB
prism-d.html 7KB
index.html 6KB
index.html 6KB
index.html 6KB
prism-javastacktrace.html 5KB
prism-processing.html 5KB
index.html 5KB
prism-actionscript.html 5KB
index.html 5KB
index.html 5KB
prism-nim.html 5KB
test.html 5KB
prism-icon.html 4KB
prism-sas.html 4KB
prism-keyman.html 4KB
download.html 4KB
prism-puppet.html 4KB
prism-verilog.html 4KB
prism-opencl.html 3KB
prism-textile.html 3KB
prism-mel.html 3KB
index.html 3KB
prism-xeora.html 3KB
prism-wiki.html 3KB
prism-jolie.html 3KB
prism-vhdl.html 3KB
prism-kotlin.html 3KB
index.html 3KB
prism-renpy.html 3KB
prism-n4js.html 3KB
examples.html 3KB
prism-autohotkey.html 3KB
prism-q.html 3KB
prism-scala.html 2KB
prism-pure.html 2KB
index.html 2KB
prism-nasm.html 2KB
prism-asciidoc.html 2KB
index.html 2KB
prism-groovy.html 2KB
prism-javascript.html 2KB
prism-haskell.html 2KB
index.html 2KB
index.html 2KB
prism-gherkin.html 2KB
prism-bison.html 2KB
prism-parser.html 2KB
index.html 2KB
prism-swift.html 2KB
prism-yaml.html 2KB
prism-lua.html 2KB
prism-markdown.html 2KB
prism-smarty.html 2KB
prism-smalltalk.html 2KB
prism-fortran.html 2KB
prism-rust.html 2KB
index.html 2KB
prism-tt2.html 2KB
prism-csharp.html 2KB
index.html 2KB
prism-brainfuck.html 2KB
prism-fsharp.html 2KB
共 1972 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
01红C
- 粉丝: 1880
- 资源: 2036
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 技术资料分享aithinker-esp-12f-datasheet-cn-v1.0很好的技术资料.zip
- 技术资料分享ADDAV20SCH很好的技术资料.zip
- 技术资料分享AD9833-CH很好的技术资料.zip
- 技术资料分享AD9708很好的技术资料.zip
- 技术资料分享AD9280很好的技术资料.zip
- 技术资料分享74LS154-很好的技术资料.zip
- 技术资料分享74HC595中文资料很好的技术资料.zip
- 技术资料分享0b-esp8266-system-description-cn-v1.4很好的技术资料.zip
- 技术资料分享0a-esp8266ex-datasheet-cn-v1.0很好的技术资料.zip
- js-leetcode题解之96-unique-binary-search-trees.js
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功