北海哪里做网站建设,网站备案表不会写,下载一个网站的源码下载,视频怎样连接到wordpressBean的概念 是Spring框架在运行时管理的对象#xff0c;是任何引用程序的基本构建块。
Bean的属性 id属性#xff1a;Bean的唯一标志名#xff0c;必须以字母开头且不包含特殊字符 class属性#xff1a;用来定义类的全限定名#xff08;包名 类名#xff09; name属性…Bean的概念 是Spring框架在运行时管理的对象是任何引用程序的基本构建块。
Bean的属性 id属性Bean的唯一标志名必须以字母开头且不包含特殊字符 class属性用来定义类的全限定名包名 类名 name属性用来为Bean指定一个或多个别名且能包含特殊字符如果没有idname相当于id。 scope属性 singleton单例默认值 prototype多例 requestWeb项目中把创建的对象放到Request域中 sessionWeb项目中把创建的对象放到Session域中
单例模式定义 单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时为了防止频繁地创建对象使得内存飙升单例模式可以让程序仅在内存中创建一个对象让所有需要调用的地方都共享这一单例对象。 在Spring中定义Bean的时候可以指定其scope(属性)。如果是Singleton就会创建在Spring容器内创建一个全局唯一的单例Bean。需要注意的是Spring中的单例跟设计模式中的单例还是有区别的在设计模式中相同的类加载器只能创建一个实例但是在Spring中是通过Bean的id来校验唯一性就是说同一个类可以创建多个id不同的实例。
设计模式的单例
饿汉式 饿汉式在类加载时已经创建好该对象在程序调用时直接返回该单例对象即可即我们在编码时就已经指明了要马上创建这个对象不需要等到被调用时再去创建。
优点这种写法比较简单就是在类装载的时候就完成实例化。避免了线程同步问题。
缺点在类装载的时候就完成实例化没有达到Lazy Loading的效果。如果从始至终从未使用过这个实例则会造成内存的浪费。
public class Singleton {//在类初始化时就实例化好了当前对象private static Singleton instance new Singleton();//私有无参构造防止类在外部被实例化private Singleton(){}public static Singleton getInstance() {return instance;}
}
懒汉式(线程不安全) 这种写法起到了懒加载的效果但是只能在单线程下使用。如果在多线程下一个线程进入了判断语句块还未来得及往下执行另一个线程也通过了这个判断语句这时便会产生多个实例。所以在多线程环境下不可使用这种方式。
public class Singleton {private static Singleton instance;private Singleton(){}public static Singleton getInstance() {if(instance null) instance new Singleton();return instance;}
}
懒汉式(线程安全)
优点线程安全
缺点效率太低了每个线程在想获得类的实例时候执行getInstance()方法都要进行同步。而其实这个方法只执行一次实例化代码就够了后面的想获得该类实例直接return就行了。方法进行同步效率太低要改进。
public class Singleton {private static Singleton instance;private Singleton(){}public static synchronized Singleton getInstance() {if(instance null) instance new Singleton();return instance;}
}
双重检查锁DCL volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制同步块或方法和 volatile 变量相比于synchronizedsynchronized通常称为重量级锁volatile更轻量级因为它不会引起线程上下文的切换和调度。但是volatile 变量的同步性较差有时它更简单并且开销更低而且其使用也更容易出错。 优点线程安全延迟加载效率较高。
public class Singleton {private volatile static Singleton instance;private Singleton(){}public static Singleton getInstance() {if(instance null){synchronized(Singleton.class){if(instance null){instance new Singleton();}}}return instance;}
}
静态内部类 这种方式跟饿汉式方式采用的机制类似但又有不同。两者都是采用了类装载的机制来保证初始化实例时只有一个线程。不同的地方在饿汉式方式是只要Singleton类被装载就会实例化没有Lazy-Loading的作用而静态内部类方式在Singleton类被装载时并不会立即实例化而是在需要实例化时调用getInstance方法才会装载SingletonInstance类从而完成Singleton的实例化。类的静态属性只会在第一次加载类的时候初始化所以在这里JVM帮助我们保证了线程的安全性在类进行初始化时别的线程是无法进入的。优点避免了线程不安全延迟加载效率高。
public class Singleton {private Singleton(){}private static class SingletonInstance{private static final Singleton INSTANCE new singleton();}public static Singleton getInstance() {return SingletonInstance.INSTANCE;}
}
枚举 不仅能避免多线程同步问题而且还能防止反序列化重新创建新的对象。
public enum Singleton{INSTANCE;
}
Spring源码 关于Spring中的单例模式主要就看org.springframework.beans.factory.support.AbstractBeanFactory。会从getBean()方法中调用doGetBean()方法而在doGetBean()中就是判断bean的属性去决定单例或者多例这里主要研究单例。 其次在看org.springframework.beans.factory.support.DefaultSingletonBeanRegistry。在这里面可以观察到getSingleton()的三个重载方法。还有其方法内有雾个很重要的属性。
/*** 在一个CurrentHashMap中存储beanName到beanInstance的映射关系* 从代码可以看出Spring在创建一个单例bean的时候会先通过beanName从一级缓存中获取* 当获取不到是才会去调用回调函数createBean进行实例创建* 在createBean中调用doCreateBean在doCreateBean中调用instantiateBean()方法。*/
private final MapString, Object singletonObjects new ConcurrentHashMap(256);
//二级缓存
private final MapString, Object earlySingletonObjects new ConcurrentHashMap(16);
//三级缓存
private final MapString, ObjectFactory? singletonFactories new HashMap(16);
这个getSingleton()重载方法就用到了双重检查锁 至于bean的加载、初始化等等还是得看大牛们的文章 此篇我只去了解了Spring的单例设计模式但对于bean的过程我还是达不到那个能看得懂源码的地步。感谢观看。