ホームページ  >  記事  >  Java  >  SpringBoot のさまざまな Bean アノテーションの違いと使用シナリオは何ですか?

SpringBoot のさまざまな Bean アノテーションの違いと使用シナリオは何ですか?

WBOY
WBOY転載
2023-05-12 13:31:061031ブラウズ

さまざまな Bean アノテーションの違いと使用シナリオ

Bean とは何ですか?

Bean について話すことのサブテキストは、Spring の Bean について話すことです。Spring の BeanFactory は誰もが知っており、Bean の概念はそこから来ています。 Spring では、クラスが Spring コンテナによってインスタンス化および管理できる限り、このクラスは Bean または SpringBean と呼ばれます。

##さらに、次のような言葉も聞きました。

JavaBean、POJO、VO、DTO

これらの名前は何を意味しますか?使用シナリオは何ですか?

JavaBean

JavaBean は、Sun の JavaBean 仕様に準拠したクラスです。 JavaBean は、次の条件を満たす Java の再利用可能なコンポーネントとして理解できます。

  • パブリックなデフォルト構築メソッドが存在します。

  • これは、クラスの属性はゲッターとセッターを使用してアクセスされ、命名は標準の規則に従います

  • #このクラスはシリアル化できます
  • #POJO ( Plain Ordinary Object )

POJO は歴史的な名前ですが、なぜそう言えるのでしょうか? POJO は Entity Beans とは異なるオブジェクトであることを示すために使用されるためです。

EntityBeans は EJB における概念であり、Spring の登場以降、EJB は徐々に歴史の舞台から消えていきました。したがって、POJO が Martin Fowler によって提案されたとき、POJO は EJB インターフェイスを実装していない通常の Java クラスを指しました。現在も使用され続けているため、ejb のような古い古いものはもう誰も使用していないため、厳密に言えば、すべての Java クラスは POJO です。ただし、Spring Bean を区別するために、Spring POJO によって管理されないクラスを呼び出すことができる場合があります。

VO (値オブジェクト)

VO は、何らかのデータを保持する java.lang.Integer などのオブジェクト、またはデータ オブジェクトを指します。この概念は、Martin Fowler が『Enterprise Application Architecture』で提案した概念です。

DTO (Data Transfer Object)

DTO も EJB が提唱する概念で、データ送信時にオブジェクトを直接送信することでネットワーク上でデータを送信することを目的としています。 。

要約:

つまり、私たちにとって、VO と DTO の間に違いはありません (ただし、Martin Fowler は、異なるセグメンテーションの概念を表現するためにこれらを使用した可能性があります)。同時に、これらは JavaBean 仕様に従っているため、JavaBean でもあります。もちろん、それらはすべて POJO です。

これらは本質的に Java オブジェクトを参照していることがわかりますが、シナリオと関数を区別するために、異なる名前が付けられています。開発中にEntityやDomainなどが登場することがあります。エンティティまたはテーブルのマッピングを表すために使用されます。一般に、開発を標準化するためにこれを行うことができます。

Spring によって管理されるオブジェクトの場合、Bean と呼ばれます
  • オブジェクト エンティティ クラスにマップされます。エンティティ ディレクトリに配置された、エンティティと呼ばれるデータ テーブル
  • インターフェイスの場合、json 入力パラメータの受け入れなど、データをカプセル化するために使用されます。便宜上、オブジェクトのカプセル化を定義します。 dto (または pojo) と呼ばれるパラメータ。これを pojo パッケージに入れて、特定のテーブルのマッピング クラスではないことを示します。
  • アノテーション @Bean @Component などの違いは何ですか?
SpringBoot でアプリケーションを開発する場合、アノテーションを使用してオブジェクトを Spring コンテナに渡して管理します。これらのアノテーションには次のものが含まれます:

@Component、@Service、@Bean、@Controller、@Repository

これらのアノテーションは本質的に Spring 識別子であり、Bean の自動検出に使用されます。これらのアノテーションが付けられたクラスは、Spring コンテナーによって管理されます。

では、なぜこれらのカテゴリがあるのでしょうか? すべての作業に注釈を使用しないのはなぜでしょうか?

まず第一に、これらのアノテーションはセマンティクスに基づいてさまざまなレベルで使用されます

    @コンポーネント
  • 一般コンポーネント

  • @Service
  • はサービス層コンポーネントです。

  • @Bean
  • これについては後で説明する @Configuration と一緒に使用する必要があります。後で

  • @Controller
  • は SpringMVC コントロール層で使用されます

  • #@Repository
  • はデータ アクセス レイヤー

    Spring がこのように設計されているのは、これらのアノテーションが自動検出のためだけではないためです。同時に @Repository アノテーションなどのさまざまな機能があり、Spring では強化された処理と関連する例外処理が追加されます。
@コントローラーの Bean は、ネットワーク リクエスト関連のロジックを処理します。したがって、すべての Bean に同じアノテーションをマークすると、確かに Spring コンテナに注入されますが、関数は機能しない可能性があります。

そして、Spring のバージョンがアップグレードされると、さらに差別化された処理が追加される可能性があります。したがって、仕様に従ってアノテーションを付ける必要があります。

@Bean について言えば、Spring の初期の頃、Bean はまだ 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:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd">
     
    <bean id="operations"    class="com.howtodoinjava.spring.beans.Operations"></bean>
    <bean id="employee"  class="com.howtodoinjava.spring.beans.Employee"></bean>
     
</beans>

今では、クラスに @Configuration アノテーションが付けられていることが理解できます。は XML 構成ファイルで、中央にある @Bean アノテーションです。これは xml の Bean ノードです

@Configuration
public class BeanConfiguration {
     @Bean
     public Operations operation(){
         return new Operations();
     }
     @Bean
     public Employee employee(){
         return new Employee();
     }
    
}

どちらのメソッドも @Bean アノテーションの戻り値を Spring コンテナーに注入します。 SpringBoot が起動すると、 @Configuration アノテーションをスキャンして注入します。

SpringBoot インジェクション オブジェクトの競合を解決するにはどうすればよいですか?

さて、いよいよ必要なコンポーネントを Spring コンテナ管理に渡します。どのように使用すればよいでしょうか?

public static void main(String[] args) {
        ApplicationContext application = SpringApplication.run(ConsumerApplication.class, args);
        application.getBean(Employee.class);
}

Spring コンテキストを使用して必要なオブジェクトを取得できます

@Autowire
private Employee employee;

通常、コンテナ内の Bean を取得するには @Autowire アノテーションを使用します

@Component("bean01")
public class Bean01 implement AA{
    
}

@Component("bean02")
public class Bean02 implement AA{
    
}

コンテナを注入する必要がある場合がありますニーズに合わせてクラスの複数のインスタンスをコンテナに追加します。

比如一个接口的实现类有两个,如果直接通过@Component注入容器,则会报错。

如何区分?

@Component("bean01")
public class Bean01 implement AA{
    
}

@Component("bean02")
public class Bean02 implement AA{
    
}

没错,通过在注解中标识一个名称,来区分该对象的不同实例。

获取时:最终会初始化一个Bean01

@Autowire
@Qualifier("bean01")
private AA a;

这样有个问题,就是每次使用都需要显示声明@Qualifier来指定。有的场景下,我们可能想默认使用一个,其他情况再显式指定。这就涉及到@Primary

在注解时,标注了@Primary的Bean在没有指定的情况下,会默认加载。

比如:

@Component
@Primary
public class Bean01 implement AA{
    
}

@Component("bean02")
public class Bean02 implement AA{
    
}

使用时: 默认初始化的就是Bean01

@Autowire
private AA a;

SpringBoot的各种注解

@Configuration

表示当前类可以用作配置文件使用

可以在这个类中使用@bean注解来创建对象(类似于单例模式的饿汉式)。

方法中需要有返回值+使用new这个关键字

spring会把这个返回值放入spring容器中;

在后面的方法中如果要调用这个方法(@bean中有个属性name,命名name的值,在后面的@resource中使用使用按照名称注入)没有使用name这个属性的话,默认情况下@bean方法的方法名;

  • @importResource:用来导入xml文件,xml文件里面也是声明java对象,同样也是导入到spring容器中

  • @propertySource:用来导入property文件

可以和@value一起使用,@value来用读取property文件的内容;

  • @componentScan:用来指定扫描注解的位置,扫描把扫描到的注解生成对象放入spring容器中,

属性:basePackage:指定扫描到包的位置

默认情况下是扫描当前包和子包的位置

  • @SpringBootApplication

由三个主要注解组合而成:@SpringBootConfiguration+@EnableAutoConfiguration+@ComponentScan

  • @SpringBootCOnfiguration:表示这个类可以作为配置类使用;

  • @EnableAutoConfiguration:启动自动注入,把java文件配置好,直接注入到Spring容器中;

  • @ComponentScan:表示文件下的注解,用来创建对象

  • @ConfigurationProperties:使用在java类上,表示使用K-V自动注入到对应的java属性上,

参数prefix:把properties文件中对应的前缀.后面的属性对应到properties文件的属性中(使用在类上,所以在属性上可以自动赋值)

和@value是两种用法

@controller、@service、@Repository、@component

这些注解使用在java类上,componentScan会扫描这些完成对象的创建

  • @controller使用在控制层,完成接收请求参数,调用service层完成用户的请求,返回视图层给用户;

  • @Service:业务层的逻辑,调用dao层完成用户对数据库的操作,将处理结果返回给controller;

  • @Repository:使用对数据库进行持久化操作(保证用户的数据可以写入到数据库中),将处理结果返回给service层

##在SpringBoot中使用@mapper代替这个注解。用来告诉mybatis创建这个对象的动态代理对象

##@mapperScan(basePackage:指定的mapper文件的路径),使用在主启动类上,省的一个一个dao层都要使用到@mapper

  • @component:用来创建对象,但是对象没有前面三个有特殊的功能

  • @transaction:表示开启事务(一般使用在service层)有五个参数

1、传播行为 2、隔离级别 3、超时行为 4、回滚规则 5、是否只读

@RestController   = @responseBody+@controller

使用在类上:表示这个类是控制层,而且类中的所有方法加上@responseBody这个注解

以上がSpringBoot のさまざまな Bean アノテーションの違いと使用シナリオは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。