• java-Spring-入门学习-第二天(单例模式和多例模式)


    目录

     Bean作用域

    单例模式(默认可以不写)

    Spring下的 @AutoWired 依赖注入

    JaveEE下的 @Resource 依赖注入

    多例模式


     Bean作用域

    ​在Spring框架中,Bean是按照作用域来创建的,常见的作用域有两种:Singleton 和 Prototype。Singleton (单例)是指整个应用中只有一个实例,并在第一次请求时创建实例

    Prototype (多例)是指每次请求都会创建一个新的实例并返回,每个实例之间是相互独立的。

    @Scope注解指定bean的作用域
    取值含义
    @Scope("singleton")(默认)在IoC容器中,在bean的对象为单实例
    @Scoper("prototype")在IoC容器中,在bean中有多个实例

    单例模式(默认可以不写)

    Spring下的 @AutoWired 依赖注入

    注意的是@Autowired 不能以类的名字来寻找对应的Product的实体类,需要通过@Qualifier来查找对应的接口实体类,不确定对应的实体类的名会报NoUniqueBeanDefinitionException异常。

    这个异常表明Spring容器中有多个相同类型的bean候选者,但Spring不知道应该选择哪一个来注入

    1. // 一个接口
    2. interface Product {
    3. void test();
    4. }
    5. @Component("productDealWith1") // 使用 @Component 并指定 bean 名称
    6. class ProductDealWith1 implements Product {
    7. @Override
    8. public void test() {
    9. System.out.println("ProductDealWith1 test method called.");
    10. }
    11. }
    12. @Component("productDealWith") // 使用 @Component 并指定 bean 名称
    13. class ProductDealWith implements Product {
    14. @Override
    15. public void test() {
    16. System.out.println("ProductDealWith test method called.");
    17. }
    18. }
    19. @Component
    20. class ProductOrder {
    21. @Autowired
    22. @Qualifier("productDealWith1") // 使用 @Qualifier 指定要注入的 bean 名称
    23. private Product product;
    24. public void doSomething() {
    25. product.test(); // 这将调用 ProductDealWith1 的 test 方法
    26. }
    27. }
    28. public class TestProduct {
    29. public static void main(String[] args) {
    30. ApplicationContext context = new AnnotationConfigApplicationContext("demo.test.product");
    31. ProductOrder order = context.getBean(ProductOrder.class); // 获取 ProductOrder 类型的 bean
    32. order.doSomething(); // 这将间接调用 ProductDealWith1 的 test 方法
    33. }
    34. }

    ProductDealWith1  和 ProductDealWith   类都使用了 @Component 注解,并且分别通过 value 参数指定了它们的 bean 名称。在 ProductOrder 类中,通过@Autowired 和 @Qualifier 注解,我们指定了要注入的  Product 类型的 bean 是名为 "productDealWith1" 的那个。在 TestProduct 的 main 方法中,我们通过 context.getBean(ProductOrder.class) 来获取 ProductOrder 类型的 bean,并调用其 doSomething 方法,这将间接调用ProductDealWith1 的 test方法

    JaveEE下的 @Resource 依赖注入

    这边讲解一下顺便讲解@Resource依靠name找寻接口的实例

    因为@Resource是Java EE 的一部分,如果您指定了 name 属性,Spring 将会查找与指定名称匹配的 bean;如果没有指定name  属性,Spring 将会查找与注入点类型匹配的 bean

    @Configueration是将该类转变成配置类

    其次使用配置类扫描工具@ComponentScan,使其在运行编译过程中优先加载其类

    并根据其中的配置创建并管理相应的 bean

     

    1. @Configuration
    2. @ComponentScan("demo.test.product")
    3. public class AppConfig {
    4. // 该配置类告诉Spring在此包及其子包中查找带有@Component注解的类
    5. }
    6. // 一个接口
    7. interface Product {
    8. void test();
    9. }
    10. @Component(name= "productDealWith1") // 使用 @Component 并指定 bean 名称
    11. class ProductDealWith1 implements Product {
    12. @Override
    13. public void test() {
    14. System.out.println("ProductDealWith1 test method called.");
    15. }
    16. }
    17. @Component(name="productDealWith") // 使用 @Component 并指定 bean 名称
    18. class ProductDealWith implements Product {
    19. @Override
    20. public void test() {
    21. System.out.println("ProductDealWith test method called.");
    22. }
    23. }
    24. @Component
    25. class ProductOrder {
    26. @Resource(name ="productDealWith1")
    27. private Product product;
    28. public void doSomething() {
    29. product.test(); // 这将调用 ProductDealWith1 的 test 方法
    30. }
    31. }
    32. public class TestProduct {
    33. public static void main(String[] args) {
    34. ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    35. ProductOrder order = context.getBean(ProductOrder.class); // 获取 ProductOrder 类型的 bean
    36. order.doSomething(); // 这将间接调用 ProductDealWith1 的 test 方法
    37. }
    38. }

    多例模式

    1. //这边是多实例
    2. @Scope(value="prototype")
    3. //这边是单实例
    4. //@Scope(value="singleton")
    5. @Component
    6. class Product{}
    7. public class TestDBConnect {
    8. @Test
    9. public void testScope(){
    10. ApplicationContext context = new
    11. AnnotationConfigApplicationContext("demo.test.product");
    12. // 第一次获取
    13. Product product1= context.getBean(product.class);
    14. System.out.println(product1);
    15. // 第二次获取
    16. Product product2 = context.getBean(product.class);
    17. System.out.println(product2);
    18. }
    19. }

    多例模式运行

    当为多例模式 prototype 时,多次获取bean实例的地址是不同的

    单例模式运行

    当为单例模式 singleton 时,多次获取bean实例的地址是相同的

    单例模式和多例模式的区别

    单例模式适用于需要共享数据并且需要避免重复创建实例的情况。

    而多例模式适用于需要动态地创建对象并提供独立实例的情况。

  • 相关阅读:
    【JavaScript】深入讲解浏览器渲染原理
    git在线学习网站
    java毕业设计人人小说系统(附源码、数据库)
    K8S+Jenkins自动化构建微服务项目(后续)
    杭电oj 2048 神、上帝以及老天爷 C语言
    微信小程序-wxml语法
    uvm_declare_p_sequencer获取sequencer原理
    C# Socket通信从入门到精通(3)——单个异步TCP客户端C#代码实现
    GeoServer地图服务器权限控制
    GO语言篇之unsafe
  • 原文地址:https://blog.csdn.net/qq_61549190/article/details/137903984