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
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标记 -
用来标识的注解有4种
虽然随便使用哪个注解都可以将类标识,但我们最好遵循规则,根据类的不同功能和层次,使用不同的注解标识,这样可读性更好,尤其之后一些功能也需要使用特定注解标识,比如SpringMvc中的前端控制器必须使用@Controller注解标识,而这个类遵循MVC设计模式也必须处于控制层 -
按规则扫描类
只扫描符合特定规则的类
不扫描特定规则的类 -
测试是否自动装配成功
当使用注解标识的类被扫描到容器中时,就会自动装配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装配