- Spring单例模式
单例模式:是指在一个JVM进程中仅有一个实例,只有一个共享的实例存在,所有对这个bean的请求都会返回这个唯一的实例(Spring默认为单例模式)。
多例模式:对这个bean的每次请求都会创建一个新的bean实例,类似于new。
单例模式分为饿汉模式和懒汉模式
饿汉模式:spring singleton的缺省是饿汉模式:启动容器时(即实例化容器时),为所有spring配置文件中定义的bean都生成一个实例。
懒汉模式:在第一个请求时才生成一个实例,以后的请求都调用这个实例spring singleton设置为懒汉模式:。
- Spring单例模式优势
1)节省系统资源,没必要每个请求都新建一个对象。
2) 防止并发问题。 - Spring线程安全
1) Spring对每个bean提供了一个scope属性来表示该bean的作用域。它是bean的生命周期。例如,一个scope为singleton的bean,在第一次被注入时,会创建为一个单例对象,该对象会一直被复用到应用结束。
2) 虽然spring对象是单例的,但类里面方法对每个线程来说都是独立运行的,不存在多线程问题,只有成员变量有多线程问题,若方法里使用了成员变量就需要考虑线程安全问题。
3) 方法都是独立的,每个用户在访问的时候单独开辟了空间;而成员变量却是共有的,所有用户都是调用的同一个。
成员变量与局部变量的区别
1)类中位置不同: 成员变量在类中方法外面;局部变量在方法或者代码块中,或者方法的声明上(即在参数列表中)。
2) 内存存储方式不同:成员变量在堆中(方法区中的静态区);局部变量在栈中。
3) 生命周期不同:成员变量随着对象的创建而存在,随着对象的消失而消失;随着方法的调用或者代码块的执行而存在,随着方法的调用完毕或者代码块的执行完毕而消失。
4) 初始值:成员变量有默认初始值;局部变量没有默认初始值,使用之前需要赋值。
- 单例模式与多例模式示例
设置bean为单例模式(singleton)
@Component(value = "userBean")
/**单例模式*/
@Scope("singleton")
public class UserBean {
private String userId;
private String userName;
......
}
设置bean为多例模式(prototype)
@Component(value = "userBean")
/**多例模式*/
@Scope("prototype")
public class UserBean {
private String userId;
private String userName;
......
}
测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:config/spring-context.xml" })
public class SpringModelTest {
@Autowired
private ISpringModelService springModelService;
@Test
public void testSpringModel() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "config/spring-context.xml" });
UserBean userBean1 = (UserBean) context.getBean("userBean");
UserBean userBean2 = (UserBean) context.getBean("userBean");
springModelService.sayHi(userBean1);
springModelService.sayHi(userBean2);
}
}
服务层实现
@Service
public class SpringModelServiceImpl implements ISpringModelService {
@Override
public void sayHi(UserBean userBean) {
System.out.println(userBean.toString());
}
}
单例输出:
com.uaf.nlp.score.UserBean@35aec48e
com.uaf.nlp.score.UserBean@35aec48e
多例输出:
com.uaf.nlp.score.UserBean@6e2a7e6c
com.uaf.nlp.score.UserBean@b4559a7
从示例中可以看出单例模式两个变量指向通一个对象,多例模式每次访问bean均创建一个实例。