Skip to content

Commit f99f764

Browse files
committed
add BeanPostProcessor
1 parent 6a4e4cf commit f99f764

File tree

7 files changed

+106
-30
lines changed

7 files changed

+106
-30
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package us.codecraft.tinyioc.beans;
2+
3+
public interface BeanPostProcessor {
4+
5+
Object postProcessBeforeInitialization(Object bean, String beanName) throws Exception;
6+
7+
Object postProcessAfterInitialization(Object bean, String beanName) throws Exception;
8+
9+
}

src/main/java/us/codecraft/tinyioc/beans/factory/AbstractBeanFactory.java

+43-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package us.codecraft.tinyioc.beans.factory;
22

33
import us.codecraft.tinyioc.beans.BeanDefinition;
4+
import us.codecraft.tinyioc.beans.BeanPostProcessor;
45

56
import java.util.ArrayList;
67
import java.util.Iterator;
@@ -17,6 +18,8 @@ public abstract class AbstractBeanFactory implements BeanFactory {
1718

1819
private final List<String> beanDefinitionNames = new ArrayList<String>();
1920

21+
private List<BeanPostProcessor> beanPostProcessors = new ArrayList<BeanPostProcessor>();
22+
2023
@Override
2124
public Object getBean(String name) throws Exception {
2225
BeanDefinition beanDefinition = beanDefinitionMap.get(name);
@@ -26,10 +29,26 @@ public Object getBean(String name) throws Exception {
2629
Object bean = beanDefinition.getBean();
2730
if (bean == null) {
2831
bean = doCreateBean(beanDefinition);
32+
initializeBean(bean, name);
2933
}
3034
return bean;
3135
}
3236

37+
protected void initializeBean(Object bean, String name) throws Exception {
38+
for (BeanPostProcessor beanPostProcessor : beanPostProcessors) {
39+
bean = beanPostProcessor.postProcessBeforeInitialization(bean, name);
40+
}
41+
42+
// TODO:call initialize method
43+
for (BeanPostProcessor beanPostProcessor : beanPostProcessors) {
44+
bean = beanPostProcessor.postProcessAfterInitialization(bean, name);
45+
}
46+
}
47+
48+
protected Object createBeanInstance(BeanDefinition beanDefinition) throws Exception {
49+
return beanDefinition.getBeanClass().newInstance();
50+
}
51+
3352
public void registerBeanDefinition(String name, BeanDefinition beanDefinition) throws Exception {
3453
beanDefinitionMap.put(name, beanDefinition);
3554
beanDefinitionNames.add(name);
@@ -42,12 +61,29 @@ public void preInstantiateSingletons() throws Exception {
4261
}
4362
}
4463

45-
/**
46-
* 初始化bean
47-
*
48-
* @param beanDefinition
49-
* @return
50-
*/
51-
protected abstract Object doCreateBean(BeanDefinition beanDefinition) throws Exception;
64+
protected Object doCreateBean(BeanDefinition beanDefinition) throws Exception {
65+
Object bean = createBeanInstance(beanDefinition);
66+
beanDefinition.setBean(bean);
67+
applyPropertyValues(bean, beanDefinition);
68+
return bean;
69+
}
70+
71+
protected void applyPropertyValues(Object bean, BeanDefinition beanDefinition) throws Exception {
72+
73+
}
74+
75+
public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) throws Exception {
76+
this.beanPostProcessors.add(beanPostProcessor);
77+
}
78+
79+
public List getBeansForType(Class type) throws Exception {
80+
List beans = new ArrayList<Object>();
81+
for (String beanDefinitionName : beanDefinitionNames) {
82+
if (type.isAssignableFrom(beanDefinitionMap.get(beanDefinitionName).getBeanClass())) {
83+
beans.add(getBean(beanDefinitionName));
84+
}
85+
}
86+
return beans;
87+
}
5288

5389
}

src/main/java/us/codecraft/tinyioc/beans/factory/AutowireCapableBeanFactory.java

+2-13
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,18 @@
11
package us.codecraft.tinyioc.beans.factory;
22

3-
import java.lang.reflect.Field;
43
import us.codecraft.tinyioc.BeanReference;
54
import us.codecraft.tinyioc.beans.BeanDefinition;
65
import us.codecraft.tinyioc.beans.PropertyValue;
76

7+
import java.lang.reflect.Field;
8+
89
/**
910
* 可自动装配内容的BeanFactory
1011
*
1112
1213
*/
1314
public class AutowireCapableBeanFactory extends AbstractBeanFactory {
1415

15-
@Override
16-
protected Object doCreateBean(BeanDefinition beanDefinition) throws Exception {
17-
Object bean = createBeanInstance(beanDefinition);
18-
beanDefinition.setBean(bean);
19-
applyPropertyValues(bean, beanDefinition);
20-
return bean;
21-
}
22-
23-
protected Object createBeanInstance(BeanDefinition beanDefinition) throws Exception {
24-
return beanDefinition.getBeanClass().newInstance();
25-
}
26-
2716
protected void applyPropertyValues(Object bean, BeanDefinition mbd) throws Exception {
2817
for (PropertyValue propertyValue : mbd.getPropertyValues().getPropertyValues()) {
2918
Field declaredField = bean.getClass().getDeclaredField(propertyValue.getName());
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,41 @@
11
package us.codecraft.tinyioc.context;
22

3+
import us.codecraft.tinyioc.beans.BeanPostProcessor;
34
import us.codecraft.tinyioc.beans.factory.AbstractBeanFactory;
45

6+
import java.util.List;
7+
58
/**
69
710
*/
811
public abstract class AbstractApplicationContext implements ApplicationContext {
9-
protected AbstractBeanFactory beanFactory;
12+
protected AbstractBeanFactory beanFactory;
1013

11-
public AbstractApplicationContext(AbstractBeanFactory beanFactory) {
12-
this.beanFactory = beanFactory;
13-
}
14+
public AbstractApplicationContext(AbstractBeanFactory beanFactory) {
15+
this.beanFactory = beanFactory;
16+
}
1417

15-
public void refresh() throws Exception{
16-
}
18+
public void refresh() throws Exception {
19+
loadBeanDefinitions(beanFactory);
20+
registerBeanPostProcessors(beanFactory);
21+
onRefresh();
22+
}
1723

18-
@Override
19-
public Object getBean(String name) throws Exception {
20-
return beanFactory.getBean(name);
24+
protected abstract void loadBeanDefinitions(AbstractBeanFactory beanFactory) throws Exception;
25+
26+
protected void registerBeanPostProcessors(AbstractBeanFactory beanFactory) throws Exception {
27+
List beanPostProcessors = beanFactory.getBeansForType(BeanPostProcessor.class);
28+
for (Object beanPostProcessor : beanPostProcessors) {
29+
beanFactory.addBeanPostProcessor((BeanPostProcessor) beanPostProcessor);
30+
}
31+
}
32+
33+
protected void onRefresh() throws Exception{
34+
beanFactory.preInstantiateSingletons();
2135
}
36+
37+
@Override
38+
public Object getBean(String name) throws Exception {
39+
return beanFactory.getBean(name);
40+
}
2241
}

src/main/java/us/codecraft/tinyioc/context/ClassPathXmlApplicationContext.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public ClassPathXmlApplicationContext(String configLocation, AbstractBeanFactory
2626
}
2727

2828
@Override
29-
public void refresh() throws Exception {
29+
protected void loadBeanDefinitions(AbstractBeanFactory beanFactory) throws Exception {
3030
XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(new ResourceLoader());
3131
xmlBeanDefinitionReader.loadBeanDefinitions(configLocation);
3232
for (Map.Entry<String, BeanDefinition> beanDefinitionEntry : xmlBeanDefinitionReader.getRegistry().entrySet()) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package us.codecraft.tinyioc;
2+
3+
import us.codecraft.tinyioc.beans.BeanPostProcessor;
4+
5+
/**
6+
7+
*/
8+
public class BeanInitializeLogger implements BeanPostProcessor {
9+
@Override
10+
public Object postProcessBeforeInitialization(Object bean, String beanName) throws Exception {
11+
System.out.println("Initialize bean " + beanName + " start!");
12+
return bean;
13+
}
14+
15+
@Override
16+
public Object postProcessAfterInitialization(Object bean, String beanName) throws Exception {
17+
System.out.println("Initialize bean " + beanName + " end!");
18+
return bean;
19+
}
20+
}

src/test/resources/tinyioc.xml

+3
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,7 @@
1717
<property name="outputService" ref="outputService"></property>
1818
</bean>
1919

20+
<bean name="beanInitializeLogger" class="us.codecraft.tinyioc.BeanInitializeLogger">
21+
</bean>
22+
2023
</beans>

0 commit comments

Comments
 (0)