ssm框架之spring的bean作用域,生命周期,后置处理器,连接池,自动装配

1、Bean的作用域

首先需要了解一下几个概念,这里我重写了Car实体类的无参构造,添加了输出语句System.out.println(“Car类构造器被调用”)

  • 单例bean

    单例就是一种设计模式,当我们要创建使用同一个类成百上千次时,new 100甚至1000个对象肯定是不现实的,这时就出现了单例,就是我们使用某个类时,只使用它直接提供的对象,那么不论在何时,都使用同一个对象(同一个实例),将100个1000个变为1个,自然提升效率,这就是单例设计模式。
    **而在spring容器中
    • 单例bean会在容器初始化时被创建
    • 无论何时获取这个bean,都不会再创建新的bean,外界始终获取同一个实例
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
  • 原型多例bean

    多例就是,每获取一次就调用构造方法创建一个bean实例,初始化容器时,不会创建对象
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • Web环境下的bean

    • request
      如果将scope属性值设置为request,那么这个bean实例会在客户端每次进行Http请求时创建,这是在WebWebApplicationContext环境下使用的,暂时了解即可
    • session
      如果设置为session,那么这个bean会在客户端与服务器的每一次会话中创建一个bean,不同会话创建不同对象,同一会话始终使用同一对象
      一次会话包含若干次请求与响应,只有客户端或服务器终止会话,才算会话结束,同样在WebApplicationContext环境下使用

2、Bean的生命周期

在这里插入图片描述
在这里插入图片描述

3、Bean的后置处理器

就是在初始化方法前后执行一些处理的类,可以对bean对象直接做逻辑处理
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、C3P0连接池配置

c3p0是一个实现数据库连接池的jar包,因为个人认为特别的好用所以使用c3p0。如果你使用的是其他jar包,可照猫画虎,原理相同。
首先,c3p0的实现是通过ComboPooledDataSource类对象进行配置连接池的
使用之前需要先导入c3p0的jar包

  • 直接配置

在这里插入图片描述
进行如下配置即可
在这里插入图片描述

  • 引用外部文件配置(实际开发使用这种方式)
    需要context命名空间在这里插入图片描述
    创建外部文件,将信息写在外部文件中,起到解耦的作用(其实文件中都是key=value的形式,就是使用键值对保存数据,xml中可使用${key}的形式根据键引用相应value)在这里插入图片描述
    获取外部文件,并引用其中信息在这里插入图片描述

5、自动装配

以往我们介绍的创建bean对象的方法都是手动装配的,接下来介绍如何自动装配组件,但并不是说,学习完自动装配后就全部使用自动装配来创建对象,而是将两种装配方式融汇贯通,不同的使用场景选择合适的装配方式

  • 通过注解标识组件
    当我们某个类需要自动装配时,得先告诉spring需要自动装配的类有哪些,我们可以通过注解标识这些类,标识后,spring就可以找到这些类,在eclipse中,标识成功的类左上角会有一个s标记
    • 第一步:导包并使用注解标识需要装配的类
      如果想使用spring的注解,必须导入AOPjar包在这里插入图片描述
      在这里插入图片描述
    • 第二步:开启spring的自动扫描,才能将标识的类扫描出来
      在这里插入图片描述
  • 用来标识的注解有4种
    虽然随便使用哪个注解都可以将类标识,但我们最好遵循规则,根据类的不同功能和层次,使用不同的注解标识,这样可读性更好,尤其之后一些功能也需要使用特定注解标识,比如SpringMvc中的前端控制器必须使用@Controller注解标识,而这个类遵循MVC设计模式也必须处于控制层
    • @Controller
      一般用来标识控制层的类,就是处理客户端请求的内一层
    • @Service
      一般用来标识业务逻辑层,就是处理业务逻辑的内一层
    • @Repository
      一般用来标识持久化层,就是操作底层资源的比如操作数据库的类
    • @Component
      一般用来标识普通的实体类,就是不属于上面3层的类
    • 通过注解自动注入的类会有一个默认id名,就是类名的首字母小写,也可以通过指定注解参数设置id值:@Component(value=“car”)
  • 按规则扫描类
    只扫描符合特定规则的类在这里插入图片描述
    不扫描特定规则的类
    在这里插入图片描述
  • 测试是否自动装配成功
    当使用注解标识的类被扫描到容器中时,就会自动装配bean到容器中,这些bean的id默认是类的首字母小写形式,如果想自定义id,在注解中设置参数value即可,例如:@Component(“自定义id值”)
    就相当于我们无需手写bean,而是spring根据我们的注解,找到指定类自动将其注入到容器中。
    在这里插入图片描述
  • @Autowired:为成员变量,构造函数,set方法自动装配
    @Autowired注解是给指定对象装配组件的注解,例如,我们容器中有Car这个bean,而我们在其他某个类中现在有一个属性需要用到这个bean,莫非还得在写一堆代码获取后在给属性赋值么?显然这么做效率不高,这时就有了这个注解,它会先根据我们这个属性的类型到容器中找相应的bean,只有一个就直接赋值,若有多个,就将属性名当成id名进行比较,找到id相应的赋值,没有就报错。
    但是如果容器没有对应的bean就只能报错么,我们在使用注解时,为其指定属性@Autowired(required = false),那么,如果这个容器中没有对应bean,就会赋一个null,而不报错
    如果有多个类型兼容的bean,可以在注解下方在添加一个注解
    @Qualifier(“id值”),将根据id进一步更明确的指定bean装配
    在这里插入图片描述
发布了23 篇原创文章 · 获赞 0 · 访问量 601

猜你喜欢

转载自blog.csdn.net/grd_java/article/details/104729709
今日推荐