【框架系列03】Spring的一些问题 & 作用域 & MVC & SSM

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容器管理
  • 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
  • 掌握工厂方式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值