目次
記事の参照アドレス、一部のコンテンツの補足と最適化
1。概要
- Beanとは
Beanと呼ばれるオブジェクトはアプリケーションのバックボーンであり、SpringIoCコンテナーによって管理されます。Beanは、Spring IoCコンテナーによってインスタンス化、アセンブル、および管理されるオブジェクトです。
- Beanを作成する方法
Springは、Beanの作成と注入を実現するために、xml構成、アノテーション構成、またはJava構成を提供します。
- IoCコンテナとの関係
Spring IoC(ApplicationContext)コンテナーは、Beanのスキャン、Beanの初期化、構成、および依存関係の管理を担当します。
2.関連事項
- Beanのアノテーションを宣言する
@Component
明確な役割のないコンポーネント@Service
ビジネスロジック層で使用されます@Repository
データアクセス層での使用@Controller
コントロールレイヤーで使用@RestController
基本的に@ Controller + @ ResponseBodyの組み合わせ@Configuration
コンポーネントおよび類似のものですが、すべての@Bean
注釈付きメソッドは動的プロキシになるため、呼び出しはメソッドの同じインスタンスであり、
- その他
-
@Scope
Beanのスコープを指定しますsingleton
:SpringコンテナにはBeanインスタンスが1つだけあります。Springコンテナが破棄または終了しない限り、Beanインスタンスは常に存続します。prototype
:Beanが取得されるたびに新しいインスタンスが存在し、Springコンテナは返されたBeanインスタンスのライフサイクル全体を担当することはできません。request
:リクエストはWebプログラムにのみ適用可能であり、各HTTPリクエストは新しいBeanを生成し、Beanは現在のHTTPリクエストでのみ有効です。リクエストが終了すると、オブジェクトのライフサイクルは終了します。session
:セッションはWebプログラムにのみ適用可能です。セッションのスコープは、HTTP要求ごとに新しいBeanが生成されることを意味し、Beanは現在のHTTPセッションでのみ有効です。application
:アプリケーションはWebプログラム、グローバルスコープにのみ適用されます
-
@Bean
メソッドレベルのBeanは通常、@ Configurationで使用されます。デフォルトでは、beanNameはメソッド名と同じです。 -
@PostConstruct
XML構成のinit-methodに対応するinitMethodを指定します -
@PreDestroy
XML構成のdestroy-methodに対応するdestroyMethodを指定します
3.Beanのライフサイクル
巨視的に言えば、Beanのライフサイクルは、定義、初期化、使用、および破棄に分けられます。コードの観点からは、次のようになります。
フローチャート
シーケンス図
4.デモ
デモには、Springブートクラス、Beanオブジェクト、BeanFactoryPostProcessor、BeanPostProcessor、InstantiationAwareBeanPostProcessorAdapterの5つのモジュールのコードが含まれます。
4.1 User.java
@Component
public class User implements BeanNameAware, BeanFactoryAware, InitializingBean, DisposableBean {
private String name;
private BeanFactory beanFactory;
private String beanName;
public User() {
System.out.println("【构造器】调用User的构造器实例化");
}
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("【注入属性】注入属性name");
this.name = name;
}
/**
* 通过<bean>的init-method属性指定的初始化方法
*/
@PostConstruct
public void userInit() {
System.out.println("【init-method】调用<bean>的init-method属性指定的初始化方法");
}
/**
* 这是BeanFactoryAware接口方法
*
* @param beanFactory
*/
@Override
public void setBeanFactory(BeanFactory beanFactory) {
System.out.println("【BeanFactoryAware接口】调用BeanFactoryAware.setBeanFactory()");
this.beanFactory = beanFactory;
}
/**
* 这是BeanNameAware接口方法
*
* @param beanName
*/
@Override
public void setBeanName(String beanName) {
System.out.println("【BeanNameAware接口】调用BeanNameAware.setBeanName()");
this.beanName = beanName;
}
/**
* 这是InitializingBean接口方法
*/
@Override
public void afterPropertiesSet() {
System.out.println("【InitializingBean接口】调用InitializingBean.afterPropertiesSet()");
}
/**
* 这是DisposableBean接口方法
*/
@Override
public void destroy() {
System.out.println("【DisposableBean接口】调用Disposable.destroy()");
}
/**
* 通过<bean>的destroy-method属性指定的初始化方法
*/
@PreDestroy
public void userDestroy() {
System.out.println("【destroy-method】调用<bean>的destroy-method属性指定的初始化方法");
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("User{");
sb.append("name='").append(name).append('\'');
sb.append('}');
return sb.toString();
}
}
4.2 MyBeanFactoryPostProcessor.java
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
public MyBeanFactoryPostProcessor() {
super();
System.out.println("这是BeanFactoryPostProcessor实现类构造器");
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0) {
System.out.println("BeanFactoryPostProcessor调用postProcessBeanFactory方法");
BeanDefinition bd = arg0.getBeanDefinition("user");
bd.getPropertyValues().addPropertyValue("name", "picheng");
}
}
4.3 MyBeanPostProcessor.java
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
public MyBeanPostProcessor() {
super();
System.out.println("这是BeanPostProcessor实现类构造器!");
}
@Override
public Object postProcessAfterInitialization(Object arg0, String arg1) {
System.out.println("BeanPostProcessor接口方法postProcessAfterInitialization对属性进行更改!");
return arg0;
}
@Override
public Object postProcessBeforeInitialization(Object arg0, String arg1) {
System.out.println("BeanPostProcessor接口方法postProcessBeforeInitialization对属性进行更改!");
return arg0;
}
}
4.4 MyInstantiationAwareBeanPostProcessor.java
@Component
public class MyInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter {
public MyInstantiationAwareBeanPostProcessor() {
super();
System.out.println("这是InstantiationAwareBeanPostProcessorAdapter实现类构造器!!");
}
/**
* 接口方法、实例化Bean之前调用
*/
@Override
public Object postProcessBeforeInstantiation(Class beanClass,
String beanName) {
System.out.println("InstantiationAwareBeanPostProcessor调用postProcessBeforeInstantiation方法");
return null;
}
/**
* 接口方法、实例化Bean之后调用
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
System.out.println("InstantiationAwareBeanPostProcessor调用postProcessAfterInitialization方法");
return bean;
}
/**
* 接口方法、设置某个属性时调用
*/
@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {
System.out.println("InstantiationAwareBeanPostProcessor调用postProcessPropertyValues方法");
return pvs;
}
}
4.5 DemoApplication.java
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
System.out.println("现在开始初始化容器");
ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
System.out.println("容器初始化成功");
// get user,并使用
User user = context.getBean("user", User.class);
System.out.println(user);
System.out.println("现在开始关闭容器!");
((ConfigurableApplicationContext) context).close();
}
}
4.6プログラムを実行し、結果を表示する
印刷されたログの数が多いため、重要な情報のみが傍受されます
现在开始初始化容器
// Porcessor初始化
这是BeanFactoryPostProcessor实现类构造器
BeanFactoryPostProcessor调用postProcessBeanFactory方法
这是BeanPostProcessor实现类构造器!
这是InstantiationAwareBeanPostProcessorAdapter实现类构造器!
// Bean初始化
InstantiationAwareBeanPostProcessor调用postProcessBeforeInstantiation方法
【构造器】调用User的构造器实例化
InstantiationAwareBeanPostProcessor调用postProcessPropertyValues方法
【注入属性】注入属性name
【BeanNameAware接口】调用BeanNameAware.setBeanName()
【BeanFactoryAware接口】调用BeanFactoryAware.setBeanFactory()
BeanPostProcessor接口方法postProcessBeforeInitialization对属性进行更改!
【init-method】调用<bean>的init-method属性指定的初始化方法
【InitializingBean接口】调用InitializingBean.afterPropertiesSet()
BeanPostProcessor接口方法postProcessAfterInitialization对属性进行更改!
InstantiationAwareBeanPostProcessor调用postProcessAfterInitialization方法
容器初始化成功
// Bean使用
User{
name='picheng'}
// Bean销毁
现在开始关闭容器!
【destroy-method】调用<bean>的destroy-method属性指定的初始化方法
【DisposableBean接口】调用Disposable.destroy()