Spring IoC and Bean
The org.springframework.beans and org.springframework.context packages are the basis for Spring Framework’s IoC container. The BeanFactory interface provides an advanced configuration mechanism capable of managing any type of object. ApplicationContext is a sub-interface of BeanFactory. It adds:
- Easier integration with Spring’s AOP features
- Message resource handling (for use in internationalization)
- Event publication
- Application-layer specific contexts such as the WebApplicationContext for use in web applications.

Create Config Get Beans
ApplicationContext context1 = new ClassPathXmlApplicationContex("services.xml");
ApplicationContext context2 = new GenericGroovyApplicationContext("services.groovy");
ApplicationContext context3 = FileSystemXmlApplicationContext("")
private static void testBean1(){
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml");
// getBean
DemoEntity entity1 = context.getBean("entity1", DemoEntity.class);
System.out.println(entity1);
DemoEntity entityAlias = context.getBean("entityAlias",DemoEntity.class);
System.out.println(entityAlias);
XML config attrs
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- factory-method -> public static factory method -->
<bean id="entity2" class="tech.realcpf.spring.dto.DemoEntity" factory-method="createInstance">
<property name="name" value="jiacheng.liu"/>
<property name="age" value="25"/>
</bean>
<!-- use xmlns:p="http://www.springframework.org/schema/p"-->
<bean id="entity3" class="tech.realcpf.spring.dto.DemoEntity"
destroy-method="destroy"
p:name="jc.liu"
p:age="89">
<!-- additional collaborators and configuration for this bean go here -->
</bean>
<!-- constructor-arg -->
<bean id="entity1" class="tech.realcpf.spring.dto.DemoEntity">
<constructor-arg type="java.lang.String" value="by constructor" name="name" index="0"></constructor-arg>
<constructor-arg type="java.lang.Integer" value="123" name="age" index="1"></constructor-arg>
</bean>
<alias name="entity1" alias="entityAlias"></alias>
<!-- depends-on other beans -->
<bean id="beanOne" class="ExampleBean" depends-on="manager"/>
<!-- <bean id="manager" class="ManagerBean" />-->
<!-- lazy-init -->
<bean id="lazy" class="com.something.ExpensiveToCreateBean" lazy-init="true"/>
<!-- <bean name="not.lazy" class="com.something.AnotherBean"/>-->
<!-- init method -->
<bean id="exampleInitBean" class="examples.ExampleBean" init-method="init"/>
<!-- scope -->
<bean id="exampleInitBean" class="examples.ExampleBean" scope="prototype"/>
</beans>


BeanPostProcessor
private static final BeanPostProcessor beanPostProcessor = new BeanPostProcessor() {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("Bean '" + beanName + "' created : " + bean.toString());
return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
}
};
// PropertyOverrideConfigurer
// PropertySourcesPlaceholderConfigurer
private static final BeanFactoryPostProcessor beanFactoryPostProcessor = new BeanFactoryPostProcessor() {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
};
Spring SPI
通过 resources/META-INF/spring.factories 作为SPI的配置文件
内容如下:
org.springframework.context.ApplicationContextInitializer=\
tech.realcpf.spring.DemoApplicationContextInitializer
org.springframework.context.ApplicationListener=\
tech.realcpf.spring.DemoApplicationListener
如果用spring-boot,再spring-boot3之后配置文件改成
resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 作为SPI的配置文件
内容则是一个类一行
其中 org.springframework.boot.autoconfigure.AutoConfiguration 是Interface名