Spring的一些问题 & 作用域 & MVC & SSM
Spring 的作用域问题
这三个 Person
完全一模一样,存储地址也一样;
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(“applicationContext.xml”);
Person person1 = ctx.getBean(“person”,Person.class);
Person person2 = ctx.getBean(“person”,Person.class);
Person person3 = ctx.getBean(“person”,Person.class);
6 种(单例)作用域
-
singleton scope 单例作用域
-
prototype scope 原型作用域
-
websocket scope 基于连接 连接断开的时候对象就消失
-
request 基于请求的,请求打过来,对象就出来(只出来一次)
-
session 基于登录的,对象登陆了,就 new 一个对象(只有一个)
-
application 基于应用程序,应用程序启动,就 new 一个对象
ApplicationContext.xml 文件中加入 作用域
做了以上更改之后,new
出来的三个对象地址不一样了;
<bean id="person" scope="prototype" class="com.…….Person">
<property name="name" value="和树不困"></property>
</bean>
Spring 对象生产的两种方式(只有两种)
- 单例:singleton (每次去的都是同一个),包括
- websocket
- request
- session
- application
- 以上四种绑定了生命周期,在一个生命周期内不会有两个不同的对象,getBean 的时候永远都是同一个对象;
- new 出来: (scope = “prototype”)
当 scope = “prototype” 的时候,每次 getBean 都是新的 Bean,否则都是一个 Bean;
什么是 单例?
- 应用程序在运行的时候只出来一个对象;
- 单例对象( 顺便 复习一下 饱汉/饿汉 模式)
为什么用单例?
- 性能好(节省内存);
- 迸发情况下,容易产生 线程安全 问题;
- 容器(如:Spring)接到请求,每一个请求都是一个 线程 ;
MVC 简介( 什么是MVC?)
- 缘起:
- 最初没有 MVC 的时候,只是一个简单的基于请求 / 响应的流模式
- Serviet(request / response) 【请求】 → Service【处理业务逻辑】 → jsp【展示】
- 【Model 控制层】一个业务逻辑都有一个 具体的类 来处理,将所有的 类 整合起来,称作
Service
- 【View 视图层】展示 结果 的一个层,jsp、下载 等
- 【Controller 接收层】接收前端给的数据层,接收之后给 Model 层来处理
SSM 结构
Spring / SpringMVC / Mybatis
- Spring 作用:
new
对象- DI 依赖注入(Controller 需要 Service,每次
new
一个十分消耗性能,DI
可以优化性能);service
(单例) - 处理逻辑DAO
(单例) - 处理数据库pojo
(多例) - 不归Spring
容器管理
- DI 依赖注入(Controller 需要 Service,每次
- SpringMVC :
- 一个MVC框架
- MyBatis:
- (使用 xml 文件)操作数据库
单例类的注意事项:
- 不能有状态数据,如果有要非常小心;
- 一个线程改了,另一个线程读了这个样子;
ThreadLocal
用来做线程隔离的,线程 与 线程之间不共享,但是 某些实体类或者某些方法中写了private
的属性(可以使用set
来修改),一个刚set
完(或者还没set
结束),另一个就也来set
了;
工厂方式
创建一个工厂接口,需要什么直接传参生成;
public interface Car{
public String getName();
public String getPrice();
}
public class AoDi implements Car{
public String getName(){
return "奥迪A7";
}
public String getPrice(){
return "100w";
}
}
public class BaoMa implements Car{
public String getName(){
return "宝马R7";
}
public String getPrice(){
return "120w";
}
}
// 工厂方法
public class CarFactory{
public Car getCar(String name){
if(name.equals("Aodi")){
retrun new Aodi();
}else if{
retrun new BaoMa();
}else{
throw new Exception("无法生产这辆车");
}
}
}
public static void main(String[] args){
Car car = new CarFac
}
- 在 ApplicationContext.xml 中定义这个工厂
<bean id="carFactory" class="com.…….carFactory"></bean>
<bean id="car" factory-bean="carFactory">
<!--需要 set 方法-->
<property name="name" value="Aodi"></property>
</bean>
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Car car = ctx.getBean("car",Car.class);
总结
- 掌握作用域
- 掌握单例
- 理解 MVC 与 SSM
- 掌握工厂方式