2.Spring单例模式

  1. Spring单例模式
    单例模式:是指在一个JVM进程中仅有一个实例,只有一个共享的实例存在,所有对这个bean的请求都会返回这个唯一的实例(Spring默认为单例模式)。
    多例模式:对这个bean的每次请求都会创建一个新的bean实例,类似于new。

单例模式分为饿汉模式和懒汉模式
饿汉模式:spring singleton的缺省是饿汉模式:启动容器时(即实例化容器时),为所有spring配置文件中定义的bean都生成一个实例。
懒汉模式:在第一个请求时才生成一个实例,以后的请求都调用这个实例spring singleton设置为懒汉模式:。

  1. Spring单例模式优势
    1)节省系统资源,没必要每个请求都新建一个对象。
    2) 防止并发问题。
  2. Spring线程安全
    1) Spring对每个bean提供了一个scope属性来表示该bean的作用域。它是bean的生命周期。例如,一个scope为singleton的bean,在第一次被注入时,会创建为一个单例对象,该对象会一直被复用到应用结束。
    2) 虽然spring对象是单例的,但类里面方法对每个线程来说都是独立运行的,不存在多线程问题,只有成员变量有多线程问题,若方法里使用了成员变量就需要考虑线程安全问题。
    3) 方法都是独立的,每个用户在访问的时候单独开辟了空间;而成员变量却是共有的,所有用户都是调用的同一个。

成员变量与局部变量的区别
1)类中位置不同: 成员变量在类中方法外面;局部变量在方法或者代码块中,或者方法的声明上(即在参数列表中)。
2) 内存存储方式不同:成员变量在堆中(方法区中的静态区);局部变量在栈中。
3) 生命周期不同:成员变量随着对象的创建而存在,随着对象的消失而消失;随着方法的调用或者代码块的执行而存在,随着方法的调用完毕或者代码块的执行完毕而消失。
4) 初始值:成员变量有默认初始值;局部变量没有默认初始值,使用之前需要赋值。

  1. 单例模式与多例模式示例

设置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均创建一个实例。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值