JavaBeanとSpringBeanのいくつかの定義

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.FactoryBeangetObject()ます。

サプライヤーは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());

    }
}

ここに画像の説明を挿入

コードリファレンス

githubテストコードアドレス

おすすめ

転載: blog.csdn.net/qq_38322527/article/details/113946325