Bean について話すことのサブテキストは、Spring の Bean について話すことです。Spring の BeanFactory は誰もが知っており、Bean の概念はそこから来ています。 Spring では、クラスが Spring コンテナによってインスタンス化および管理できる限り、このクラスは Bean または SpringBean と呼ばれます。
##さらに、次のような言葉も聞きました。JavaBean、POJO、VO、DTO
これらの名前は何を意味しますか?使用シナリオは何ですか?JavaBean
JavaBean は、Sun の JavaBean 仕様に準拠したクラスです。 JavaBean は、次の条件を満たす Java の再利用可能なコンポーネントとして理解できます。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 と呼ばれます<?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); }
@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;
表示当前类可以用作配置文件使用
可以在这个类中使用@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 サイトの他の関連記事を参照してください。