I.概要
SpringのIOCコンテナの使用には、おおよそ次の手順があります。
最初のステップ:Springを開始して、完全なBeanを生成します。
- Beanファクトリを生成する
- xmlを解析してBeanDefinitionを生成します
- BeanFactoryPostProcessorを使用してBeanFactoryを拡張する
- Beanの作成(インスタンス化); BeanPostProcessorを使用してBeanを拡張し、init-method(初期化)を呼び出します
- 完全なBeanオブジェクトを取得する
ステップ2:実際のビジネスでBeanを使用する
- 工場から豆を入手して使用する
ステップ3:IOCコンテナーを閉じて、Beanを破棄します
- Beanを破壊するにはdestroyを呼び出します
2つ目は、XMLがBeanDefinitionを生成することです。
XMLベースのBean構成ファイルをBeanDefinitionに解析するプロセス:
3つ目は、SpringBootが完全なBeanを生成することです。
第四に、春の延長
5つの簡単なプロセスシミュレーション
1.入口を開始します
package com.wuxiaolong.edu.common.spring;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test {
public static void main(String[] args) {
System.out.println("》》》》》》第一阶段=容器初始化开始《《《《《《");
AnnotationConfigApplicationContext factory = new AnnotationConfigApplicationContext(ConfigBean.class);
System.out.println("》》》》》》第一阶段=容器初始化结束《《《《《《");
System.out.println("》》》》》》第二阶段=获取person对象开始《《《《《《");
Person person = factory.getBean("person",Person.class);
System.out.println(person);
System.out.println("》》》》》》第二阶段=获取person对象结束《《《《《《");
System.out.println("》》》》》》第三阶段=关闭容器开始《《《《《《");
factory.registerShutdownHook();
System.out.println("》》》》》》第三阶段=关闭容器结束《《《《《《");
}
}
2.スキャンコードパスを設定します
package com.wuxiaolong.edu.common.spring;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* 配置启动入口
* 定义扫描的路径
* 并将Person作为bean
*
*/
@ComponentScan("com.wuxiaolong.edu.common.spring")
@Configuration
public class ConfigBean {
public ConfigBean() {
System.out.println("【ConfigBean】构造器");
}
@Bean
public Person person(){
return new Person();
}
}
3.オブジェクトを定義します
package com.wuxiaolong.edu.common.spring;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
/**
* 通过@Bean标签将Person注册成Bean
* Person实现BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean接口
* Person实例化后会调用BeanFactoryAware, BeanNameAware, InitializingBean实现的接口
* 容器关闭时会调用DisposableBean的接口
*/
public class Person implements BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean {
private String name;
private String address;
private int phone;
private BeanFactory beanFactory;
private String beanName;
public Person() {
System.out.println("【Person】构造器");
}
/**
* 这是BeanFactoryAware接口方法
*/
@Override
public void setBeanFactory(BeanFactory arg0) throws BeansException {
System.out.println("【BeanFactoryAware】 setBeanFactory()");
this.beanFactory = arg0;
}
/**
* 这是BeanNameAware接口方法
*/
@Override
public void setBeanName(String arg0) {
System.out.println("【BeanNameAware】setBeanName()" + arg0);
this.beanName = arg0;
}
/**
* 这是InitializingBean接口方法
*/
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("【InitializingBean】afterPropertiesSet()");
}
/**
* 对象初始化的时候(实例化之后)会调用该方法
*这是DiposibleBean接口方法
*/
@Override
public void destroy() throws Exception {
System.out.println("【DiposibleBean】destory()");
}
/**
* 也可以通过<bean>标签的init-method属性指定的初始化方法
*/
@PostConstruct
public void myInit() {
System.out.println("【@PostConstruct】调用指定的初始化方法");
}
/**
*
* 也可以通过<bean>标签的destroy-method属性指定的初始化方法
*/
@PreDestroy
public void myDestory() {
System.out.println("【@PreDestroy】@PreDestroy 调用指定的销毁前的方法");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getPhone() {
return phone;
}
public void setPhone(int phone) {
this.phone = phone;
}
public BeanFactory getBeanFactory() {
return beanFactory;
}
public String getBeanName() {
return beanName;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
", phone=" + phone +
//", beanFactory=" + beanFactory +
", beanName='" + beanName + '\'' +
'}';
}
}
4.BeanFactoryを拡張します
package com.wuxiaolong.edu.common.spring;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;
/**
* 通过实现BeanFactoryPostProcessor接口,参与到BeanFactory实例化的过程中,可以做一些定制化的操作
*/
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
public MyBeanFactoryPostProcessor() {
super();
System.out.println("【BeanFactoryPostProcessor】构造器");
}
/**
* person对象实例化前,给该bean附上初始值
* @param arg0
* @throws BeansException
*/
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0) throws BeansException {
System.out.println("【BeanFactoryPostProcessor】postProcessBeanFactory");
BeanDefinition bd = arg0.getBeanDefinition("person");
bd.getPropertyValues().addPropertyValue("phone", "110");
}
}
5.拡張Bean
package com.wuxiaolong.edu.common.spring;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.core.PriorityOrdered;
import org.springframework.stereotype.Component;
/**
* 容器中每个bean实例化后,都可以通过实现BeanPostProcessor接口参与到bean的初始化过程中。
* 多个自定义的BeanPostProcessor,可以通过实现PriorityOrdered决定加载的顺序
* 每个bean初始化时都会调用BeanPostProcessor的postProcessBeforeInitialization()和postProcessAfterInitialization()方法
*/
@Component
public class MyBeanPostProcessor implements BeanPostProcessor, PriorityOrdered {
public MyBeanPostProcessor() {
super();
System.out.println("【BeanPostProcessor】构造器");
}
/**
* bean初始化之前执行的方法
* 第一个参数都是要处理的Bean对象,
* 第二个参数都是Bean的name。
* 返回值也都是要处理的Bean对象。
*/
@Override
public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException {
System.out.println("【BeanPostProcessor】postProcessBeforeInitialization : " + arg1);
return arg0;
}
/**
* bean初始化之后执行的方法
* 第一个参数都是要处理的Bean对象,
* 第二个参数都是Bean的name。
* 返回值也都是要处理的Bean对象。
*/
@Override
public Object postProcessAfterInitialization(Object arg0, String arg1) throws BeansException {
System.out.println("【BeanPostProcessor】postProcessAfterInitialization : " + arg1);
return arg0;
}
/**
* 多个BeanPostProcessor时,决定BeanPostProcessor加载的顺序
*/
@Override
public int getOrder() {
System.out.println("---------0--------");
return 0;
}
}
6.実行結果
》》》》》》第一阶段=容器初始化开始《《《《《《
【BeanFactoryPostProcessor】构造器
【BeanFactoryPostProcessor】postProcessBeanFactory
【BeanPostProcessor】构造器
【BeanPostProcessor】postProcessBeforeInitialization : org.springframework.context.event.internalEventListenerProcessor
【BeanPostProcessor】postProcessAfterInitialization : org.springframework.context.event.internalEventListenerProcessor
【BeanPostProcessor】postProcessBeforeInitialization : org.springframework.context.event.internalEventListenerFactory
【BeanPostProcessor】postProcessAfterInitialization : org.springframework.context.event.internalEventListenerFactory
【ConfigBean】构造器
【BeanPostProcessor】postProcessBeforeInitialization : configBean
【BeanPostProcessor】postProcessAfterInitialization : configBean
【Person】构造器
【BeanNameAware】setBeanName()person
【BeanFactoryAware】 setBeanFactory()
【BeanPostProcessor】postProcessBeforeInitialization : person
【@PostConstruct】调用指定的初始化方法
【InitializingBean】afterPropertiesSet()
【BeanPostProcessor】postProcessAfterInitialization : person
》》》》》》第一阶段=容器初始化结束《《《《《《
》》》》》》第二阶段=获取person对象开始《《《《《《
Person{
name='null', address='null', phone=110, beanName='person'}
》》》》》》第二阶段=获取person对象结束《《《《《《
》》》》》》第三阶段=关闭容器开始《《《《《《
》》》》》》第三阶段=关闭容器结束《《《《《《
【@PreDestroy】@PreDestroy 调用指定的销毁前的方法
【DiposibleBean】destory()
公式アカウントをフォローし、「java-summary」と入力してソースコードを取得します。
終わった、それを一日と呼んでください!
[知識の普及、価値の共有]、あなたの注意とサポートに感謝します、私は[ Zhuge Xiaoyuan ]、ためらいに苦しんでいるインターネット移民労働者です。