Spring单例模式中的懒汉模式和饿汉模式的区别
懒加载(单例模式的懒汉模式):
单例实例bean:默认在容器启动的时候创建对象;
懒加载:容器启动不创建对象。第一次使用(获取)Bean创建对象,并初始化。
接上一个程序:
在默认情况下启动容器:
启动测试类
运行:默认情况下,在容器的初始化的时候就已经将所以的bean都加载进去了,这就是设计模式中单例设计模式的饿汉模式。
添加注解@Lazy
运行:这就是在调用的时候才创建单例,该模式就是设计模式中单例模式的懒汉式
修改Test类,看懒加载是不是单例:
运行:
分析注解@Conditional
现在在MainConfig2类中创建两个bean实例
同样获取配置类中所有的bean的名字
运行结果:
直接获取bean以及其中的属性
运行结果:
现在有一个新的业务需求:
如果系统是windows,给容器中注册(“bill”)
如果linux系统,给容器中注册(“linus”)
首先我们得知道在IOC容器中,我们是可以获取操作系统的名字的:
运行结果:
现在我们要动态的获取环境变量的值
我们查看Conditional的源码,我们可以看到Condition的value传入的是Condition类型
创建LinuxCondition类实现Condition接口
获取IOC使用的beanFactory
获得类加载器
获取环境信息
获取到bean定义的注册类
在BeanDefinitionRegistry类中,我们能注册、移除、得到bean
如果是Linux就返回true
创建WindowsCondition类同上
现在回到MainConfig类中:在@Conditional注解中配置相关信息(里面的类必须实现Condition接口)
运行:
现在我们修改程序运行的环境变量
在运行:
注意:该注解不仅可以配置到方法上,还可以配置到类上