Spring中单例模式的应用

文章详细阐述了Spring框架如何实现单例模式,包括通过注解自动创建和管理bean,以及手动使用SpringFactoryUtils.getBean()获取bean。同时,讨论了在一个接口有多个实现类时如何选择使用,并对比了静态变量与非静态变量在多线程环境中的区别。
摘要由CSDN通过智能技术生成

设计模式单例模式: 单例模式(singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。

Spring中单例模式的应用

Spring默认的所有的bean都单例的
spring 中加载单例的过程都是在BeanFactory接口中定义的getBean(…)这个方法中定义的,实现默认是在AbstractBeanFactory中,主要代码功能两点
  • 从缓存中获取单例bean

  • 从bean的实例中获取对象

1、使用Spring注解去new对象

Spring在启动的时候,会扫描所有需要Spring去管理的类,然后给他new一个对象,如果我需要用这个对象了,直接@Autowired。

//接口
public interface DemoService {
    public void show();
}
//实现类,这里需要加注解Service
@Service
public class DemoImpl implements DemoService {


    @Override
    public void show() {
        System.out.println("123");
    }
}
//controlelr层,这里需要加controlelr(返回的是页面)或者RestController(返回的是数据)注解
@RestController
public class HelloController {
    
    @Autowired
    DemoService demoService;
    @RequestMapping("hello")

    public String hello(){
         
         demoService.show();
        return "hello";
    }
}

前提(如果说我要使用Spring给new出来的对象,那么我这对象也要交给Spring去管理)

2、手动去new

这种情况是自己手动new对象,或者是出现Autowired拿不到的时候(这个对象不是Spring创造出来的,而是我们手动new出来的),我们就可以用SpringFactoryUtils。getBean(TestController.class),强制从Spring工厂(容器)里取出来,然后赋值。

  • 先从实例对象里面把要new的对象给他构造全参方法

public class DemoImpl1 implements DemoService {
    public DemoImpl1(HelloController helloController) {
        this.helloController = helloController;
    }

    private HelloController helloController;
    @Override
    public void show() {
        System.out.println("DemoImpl1");
    }
}
  • 用SpringFactoryUtils。getBean(TestController.class),强制从Spring工厂(容器)里取出来,然后赋值。

@RestController
public class HelloController {



    @RequestMapping("hello")
    public String hello(){

            DemoImpl1 demoImpl1 = new DemoImpl1(SpringFactoryUtils.getBean(HelloController.class));
             demoImpl1.show();
        return "hello";
    }
}

一个结构能被对此实现吗?

  • 可以

如果说一个接口有多个实现类,那么我在在用的时候怎么用?

  1. 用list去接

@RestController
public class HelloController {


    @Autowired
    List<DemoService> demoServices;
    @RequestMapping("hello")
    public String hello(){


        for (DemoService demoService : demoServices) {
            demoService.show();
        }
        return "hello";
    }
}
  1. 用具体的实现类去用。

@RestController
public class HelloController {


    @Autowired
    DemoImpl1 demoService;
    @RequestMapping("hello")
    public String hello(){
        
            demoService.show();

        return "hello";
    }
}

static和没有static的区别

@RestController
public class HelloController {

     private static int count =0;

    @RequestMapping("hello")
    public String hello(){
    count++;
        System.out.println(count);
            DemoImpl1 demoImpl1 = new DemoImpl1(SpringFactoryUtils.getBean(HelloController.class));
             demoImpl1.show();
        return "hello";
    }
}

每刷新一次页面,count都会+1,不加static的时候哦,count也会加1,看似并没有什么区别,但是

没有static的时候,count是给对象调用的

@RestController
public class HelloController {

     private  int count =0;

    @RequestMapping("hello")
    public String hello(){
    count++;       //这个是类创建单例产生的count,会一直加       
        System.out.println(count);
            HelloController helloController = new HelloController();
            System.out.println(helloController.count);//这里是对象.count,这里的count不会加
            
           
        return "hello";
    }
}

有static的情况,count是给类用的

@RestController
public class HelloController {

     private static int count =0;

    @RequestMapping("hello")
    public String hello(){
    count++;
        System.out.println(count);

            System.out.println( HelloController.count);//两个count输出一样


        return "hello";
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值