記事のディレクトリ
JavaBean和SpringBean
Beanはオブジェクトです。
JavaBeanであろうとSpringBeanであろうと、インスタンス化されたオブジェクトを取得するためのものです。違いの中で、この章のブログでは、コードケースを使用して説明しています。
Java Bean
Java BeanはJavaオブジェクトです。Javaでは、オブジェクトはnew
インスタンス化されるように定義されています。
class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Test {
public static void main(String[] args) {
User user = new User();
user.setName("香蕉");
System.out.println(user.getName());
}
}
春の豆
Spring Beanを使用してテストするには、Spring依存関係ファイルを導入する必要があります。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.13.RELEASE</version>
</dependency>
XML作成Bean
User.javaクラスを作成します
package cn.linkpower.xml;
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
ではresources
、次のファイルの作成spring.xml
ファイルを、指定された豆を設定します。
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 1、定义bean(根据User中的构造方法生成bean对象)-->
<bean id="userBean" class="cn.linkpower.xml.User"></bean>
</beans>
テストクラスを作成し、指定したspring.xml
ファイルをSpringコンテナに追加し、オブジェクトの取得を実装し、値を設定して呼び出します。
package cn.linkpower.xml;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("spring.xml");
//classPathXmlApplicationContext.setConfigLocation("spring.xml");
User userBean = classPathXmlApplicationContext.getBean("userBean", User.class);
userBean.setName("香蕉");
System.out.println(userBean.getName());
// 验证Spring的bean是单例!
// User userBean2 = classPathXmlApplicationContext.getBean("userBean", User.class);
// userBean2.setName("香蕉2");
// System.out.println(userBean.getName());
// System.out.println(userBean2.getName());
// System.out.println(userBean.getName());
}
}
@Bean Create Bean
上記の操作は、xml構成で指定されたBeanオブジェクトに従って、org.springframework.context.support.ClassPathXmlApplicationContext
オブジェクトの生成および参照操作を実行するためにSpringコンテナーにロードされます。
同時に、@Bean
オブジェクトの生成も実装できます。
package cn.linkpower.beans;
import org.springframework.context.annotation.Bean;
public class UserConfig {
/**
* 采取 @Bean 的方式,构建一个 bean对象;<br/>
* 相当于 <bean id="getUser" class="cn.linkpower.beans.User" />
* @return
*/
@Bean
public User getUser(){
return new User();
}
}
使用AnnotationConfigApplicationContext
するには、コンテナにロードします。
テストクラスの作成
package cn.linkpower.beans;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test {
public static void main(String[] args) {
// 构建容器
//AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext();
// 加载、注册配置类
// annotationConfigApplicationContext.register(UserConfig.class);
//annotationConfigApplicationContext.refresh();
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(UserConfig.class);
// 获取对象
User getUser = annotationConfigApplicationContext.getBean("getUser", User.class);
getUser.setName("banana");
System.out.println(getUser.getName());
}
}
@CompantScan Create Bean
上記の2つのメソッドはどちらも、Beanを定義または構築するために、構成クラスを構成または作成する必要があります。オブジェクトが多すぎる場合は、さらに構成する必要があります。
さらに、スキャン操作に基づくクラス定義操作を実装することもできます。
スキャン操作ツールクラスを記述します(クラスを作成し、注釈操作を追加します)。もちろん、SpringBootプロジェクトは、デフォルトでスキャン起動クラスディレクトリをスキャンします。
package cn.linkpower.beanScan;
import org.springframework.context.annotation.ComponentScan;
/**
* @ComponentScan 注解,扫描的是带有 @Component 的类,将其解析加载至spring容器中
*/
@ComponentScan("cn.linkpower.beanScan")
public class UserConfigScan {
}
@ComponentScan
アノテーションが使用されるため、指定されたクラスがスキャンされ路径
、@Component
ラベルが付けられてSpringコンテナにロードされます。したがって、クラスをSpringコンテナにロードする必要がある場合は、指定されたクラスにComponent
アノテーションを追加する必要があります。
package cn.linkpower.beanScan;
import org.springframework.stereotype.Component;
@Component
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
テストクラスを作成します。
package cn.linkpower.beanScan;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test {
public static void main(String[] args) {
// 这里主要是加载带有 @ComponentScan 注解的类,实现扫描 @Component 显示或隐式标注的类
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(UserConfigScan.class);
// 默认类名驼峰规范,所以此处从容器获取类,使用user
User user = applicationContext.getBean("user", User.class);
System.out.println(user);
}
}
Springbootで広く使用されてい@ComponentScan
ます。次に、類似@Service
の注釈やその他の注釈には@Component
注釈が付けられています。
プログラマティックBeanDefinition
建物内のSpring Beanオブジェクト、テイクxml 定义 bean
、@Bean 注解
、@Compant 注解
など、すべてされている声明式
Beanオブジェクトを作成しました。
编程式
以下に示すように、Springはインスタンスオブジェクトの作成もサポートしています。
インスタンス化されたBeanクラスを構築するにはSpringが必要
无注解
です。
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Test {
public static void main(String[] args) {
// 创建容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
// 执行一次refresh,否则报错
applicationContext.refresh();
// 描述一个bean
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setBeanClass(User.class);
// 将描述的bean,设置别名称,放入容器中
applicationContext.registerBeanDefinition("userBeanObj",beanDefinition);
// 从容器中获取bean
User userBeanObj = applicationContext.getBean("userBeanObj", User.class);
System.out.println(userBeanObj);
}
}
春のソースコードでは、それがあるかどうかを使用する@Component
、@Bean
またはxml 配置<bean />
、その基礎となる実装で静止画または取るBeanDefinition
プログラム的な建物を。
さらにBeanDefinition
、など、クラス設定に使用できる他の属性パラメータがあります单例、多例
。
FactoryBeanビルドBean
Spring(无@Component注解
)を使用してインスタンス化する必要があるクラスを作成します。
package cn.linkpower.factoryBean;
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Beanを生成するために、ファクトリクラスを記述します。
package cn.linkpower.factoryBean;
import org.springframework.beans.factory.FactoryBean;
public class UserFactory implements FactoryBean {
/**
* 生成对象
* @return
* @throws Exception
*/
public Object getObject() throws Exception {
return new User();
}
/**
* 对象的类型
* @return
*/
public Class<?> getObjectType() {
return User.class;
}
}
テストクラスを作成します。
package cn.linkpower.factoryBean;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test {
public static void main(String[] args) {
// 1、构建容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
applicationContext.refresh();
// 2、定义bean的修饰类
AbstractBeanDefinition abstractBeanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
// 添加一个类进去
abstractBeanDefinition.setBeanClass(UserFactory.class);
// 3、将已修饰的类放入容器中
applicationContext.registerBeanDefinition("userFactoryTest",abstractBeanDefinition);
//4、获取类
User user = applicationContext.getBean("userFactoryTest",User.class);
System.out.println(user);
// 这个是报错的!
//System.out.println(applicationContext.getBean("userFactoryTest",UserFactory.class));
// 如果想获取 UserFactory 对象,则需要 名称写为 &userFactoryTest
//System.out.println(applicationContext.getBean("&userFactoryTest",UserFactory.class));
}
}
[注意:]
org.springframework.beans.factory.FactoryBean
実際、変更されたBeanを使用すると、Springコンテナは2つのBeanオブジェクトを生成します。
userFactoryTest->ユーザーオブジェクトBean
&userFactoryTest-> UserFactoryクラスオブジェクトBean
Beanの間接的な定義を使用
org.springframework.beans.factory.FactoryBean
しgetObject()
ます。
サプライヤーはBeanを定義します
Springフレームワークでは、Supplierを使用してBeanを構築する操作があります。Beanが初期化されると、Supplierクラスを介してクラス初期データを生成できます。ケース情報は次のとおりです。
package cn.linkpower.supplier;
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
新しいテストクラス:
package cn.linkpower.supplier;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.util.function.Supplier;
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
applicationContext.refresh();
// 通过这种方式 注册bean
//applicationContext.registerBean(User.class);
applicationContext.registerBean(User.class, new Supplier<User>() {
public User get() {
User user = new User();
user.setName("banana");
return user;
}
});
User user = applicationContext.getBean("user", User.class);
System.out.println(user.getName());
}
}