学习笔记系列开头惯例发布一些寻亲消息
链接:https://www.baobeihuijia.com/bbhj/contents/3/192584.html
SSM框架------IOC基础【Bean+Setter注入+加载xml】
框架总览
-
Spring Framework
-
SpringMVC
- 用于web页面的三层架构:model view controller
-
Mabatis
- 用于链接数据库
-
spring的核心IOC与DI
- 原始问题:如果在一个类中new一个对象,那么这个对象的类定义发生改变时,这个类也会发生变化,那么就需要重新编译,上线
- 控制反转:解耦,不要类之间互相new对象了,我们类,都把对象创建和初始化的权利全都放到外部的一个IOC容器,IOC可以从JVM方法区拿到类的字节码定义以及运行时常量池,来生成对象Bean。
- 依赖注入DI:在容器中,如果两个对象之间存在依赖关系,IOC就直接就绑好
-
IOC实操(对象在容器的取与拿)
-
pom中需要导入spring坐标
-
在resources下配置spring,新建一个applicationContext.xml(相当于spring的IOC容器)
-
把类以bean的形式放入到spring容器中,起一个别名
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
-
获取bean
// 获取IOC容器 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); // 获取bean BookDao bookDao = (BookDao)ctx.getBean("bookDao"); bookDao.save(); BookServie bookservice = (BookServie)ctx.getBean("bookService");
-
-
DI实操(建立对象之间的依赖关系)
// 取出类内部new另一个类对象的代码 private BookDao bookDao; // 改用set方法来描述,容器会根据配置将对象注入 public void setBookDao(BookDao bookDao){ this.bookDao = bookDao; }
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/> <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"/> 改写为 <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/> <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"> // 第一个是set内的名字,ref后边是bean <property name = "bookDao" ref="bookDao"/> </bean>
-
修改单例为多例
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" scope="singleton"/> <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" scope="prototype"/>
-
-
bean实例化的一些古老方法
- 一、构造方法:容器调用无参构造方法得到的对象,是通过反射得到的(哪怕构造方法是类内私有也可以构造)
- 二、静态工厂
- 三、实例工厂
- 改进:FactoryBean方法,一个factory对象,但是内部都是getobject写的是要new的对象
-
依赖注入方式
-
setter注入(拿的时候写好属性和setter,存的时候要写好bean以及property)
-
引用类型
-
简单类型
<property name="databaseName" value="mysql"/>
-
-
构造器注入
-
引用类型
public BookServiceImpl(BookDao bookDao, UserDao userDao) { this.bookDao = bookDao; this.userDao = userDao; } <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"> <constructor-arg name="userDao" ref="userDao"/> <constructor-arg name="bookDao" ref="bookDao"/> </bean>
-
简单类型
private String databaseName; private String connectionNum; public BookDaoImpl(String databaseName, String connectionNum) { this.databaseName = databaseName; this.connectionNum = connectionNum; } <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"> <!--根据构造方法参数位置注入--> <constructor-arg index="0" value="mysql"/> <constructor-arg index="1" value="100"/> </bean>
-
-
两种方式的选择
- 构造器注入是强制必须执行的,而setter注入可能会不进行注入导致对象为null
- 首选setter
-
-
依赖自动装配(只能用于引用类型注入,不能简单类型)
- 类型匹配:内部用setter,外部按照setter类型找到对应的bean注入,要求类型只有一个
- 按名匹配:内部用setter,外部按照setter的名字找到对应的bean注入,不推荐使用
-
集合注入:array list set map property
-
加载管理一个第三方资源
-
如果想要使用别的工具,那么需要pom中导入包,然后利用导入的类新建一个bean对象,就可以使用这些类工具了
-
连接池对象
-
在bean中读取配置文件:开启一个context命名空间,使用context加载properites文件
-
使用属性占位符读取properites文件
// 如果文件中的名字和系统的名字重复,那么需要在context读取的时候添加 <context:property-placeholder location="jdbc.properties,jdbc2.properties" system-properties-mode="NEVER"/> // 加载全部properties <context:property-placeholder location="*.properties" system-properties-mode="NEVER"/> // 加载当前路径以及依赖的jar包的properties <context:property-placeholder location="classpath*.properties" system-properties-mode="NEVER"/>
-
-
容器生命周期
-
容器加载
-
获取bean
-
beanFactory初始化bean(调用构造函数)会延时加载,而applicationcontext初始化bean会立即加载
-
容器关闭
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init",destory-mewthod="destory"/> # 关闭容器才能执行对象的销毁操作 // 方法一 ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); ctx.closee(); // 方法二:关闭钩子 ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); ctx.registerShutdownHook();
-
流程(bean对象仍然为普通对象,也会通过垃圾回收机制收集)
- 初始化容器
- 当 Spring 容器启动时,它会读取配置文件并实例化容器中的所有对象Bean,调用构造方法,根据方法区的字节码创建对象
- 执行属性注入setter
- 容器中该bean的init
- 如果遇到关闭销毁容器,则执行bean的销毁方法
-
象仍然为普通对象,也会通过垃圾回收机制收集)
-
初始化容器
-
当 Spring 容器启动时,它会读取配置文件并实例化容器中的所有对象Bean,调用构造方法,根据方法区的字节码创建对象
-
执行属性注入setter
-
容器中该bean的init
-
如果遇到关闭销毁容器,则执行bean的销毁方法