文章目录
前言
该系列是对SSM框架教程的学习笔记,涉及到了Spring,SpringMVC,Maven,SpringBoot,MyBatisPlus。内容根据官方给出的代码资源进行整理,资源已给出供参考。
一、IoC入门
<!--1.导入spring的坐标spring-context,对应版本是5.2.10.RELEASE-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<!--2.配置bean-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
<!--3.获取IoC容器-->
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
<!--4.获取bean(根据bean配置id获取)-->
BookService bookService = (BookService) ctx.getBean("bookService");
bookService.save();
<!--5.删除业务层中使用new的方式创建的dao对象-->
private BookDao bookDao;
<!--6.提供对应的set方法-->
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
<!--7.配置server与dao的关系-->
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
<property name="bookDao" ref="bookDao"/>
</bean>
<!--property标签表示配置当前bean的属性
name属性表示配置哪一个具体的属性
ref属性表示参照哪一个bean-->
二、bean
1.bean配置
(1)bean基础配置
<bean id="bookService" name="service service4 bookEbi" class="com.itheima.service.impl.BookServiceImpl"/>
(2)bean别名配置
定义bean的别名可定义多个,使用逗号, 分号; 空格 分割
<bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl" />
(3)bean作用范围配置
<!--scope:为bean设置作用范围,可选值为单例singloton,非单例prototype-->
<bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl" scope="prototype"/>
2.bean实例化
(1)构造函数
- bean本质上就是对象,创建bean使用构造方法完成
(2)静态工厂
public class OrderDaoFactory {
public static OrderDao getOrderDao(){
System.out.println("factory setup....");
return new OrderDaoImpl();
}
}
- 配置
<bean id="orderDao" class="com.itheima.factory.OrderDaoFactory" factory-method="getOrderDao"/>
(3)实例工厂
- 实例工厂
public class UserDaoFactory {
public UserDao getUserDao(){
return new UserDaoImpl();
}
}
- 配置
<bean id="userFactory" class="com.itheima.factory.UserDaoFactory"/>
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
(4)FactoryBean [实用]
- FactoryBean
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
//代替原始实例工厂中创建对象的方法
public UserDao getObject() throws Exception {
return new UserDaoImpl();
}
public Class<?> getObjectType() {
return UserDao.class;
}
/* public boolean isSingleton(){
return true;
}*/
//此方法使其创建单例对象
}
- 配置
<bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/>
3.bean的生命周期
- 初始化容器
- 创建对象(内存分配)
- 执行构造方法
- 执行属性注入(set)
- 执行bean初始化方法
- 使用bean—执行业务操作
- 关闭/销毁容器
(1)bean生命周期控制
1)提供生命周期控制方法
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ...");
}
//表示bean初始化对应的操作
public void init(){
System.out.println("init...");
}
//表示bean销毁前对应的操作
public void destory(){
System.out.println("destory...");
}
}
- 配置生命周期的方法
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>
2)实现InitializingBean, DisposableBean接口
public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
System.out.println("set .....");
this.bookDao = bookDao;
}
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
public void destroy() throws Exception {
System.out.println("service destroy");
}
public void afterPropertiesSet() throws Exception {
System.out.println("service init");
}
}
(2)bean销毁时机
- 容器关闭前触发bean的销毁
- 关闭容器方式
- 手工关闭
- 注册关闭钩子,在Java虚拟机退出前先关闭容器再退出虚拟机
ctx.registerShutdownHook();
三、DI (依赖注入)
1.依赖注入方式
1. 向一个类中传递数据有两种方式:普通方法(set)和构造方法
2. 依赖注入需要描述在容器中建立bean与bean之间的依赖关系,也涉及bean与数字或字符串,所以就有两种类型:引用类型和简单类型
3. 因此,依赖注入方式分为以下几种:
- setter注入
- 简单类型
- 引用类型
- 构造器注入
- 简单类型
- 引用类型
(1)setter注入
1)简单类型
· 在bean中定义引用类型属性并提供可访问的set方法
public class BookDaoImpl implements BookDao {
private int connectionNum;
//setter注入需要提供要注入对象的set方法
public void setConnectionNum(int connectionNum) {
this.connectionNum = connectionNum;
}
}
· 配置中使用property标签value属性注入简单类型数据
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
<!--property标签:设置注入属性-->
<!--name属性:设置注入的属性名,实际是set方法对应的名称-->
<!--value属性:设置注入简单类型数据值-->
<property name="connectionNum" value="100"/>
</bean>
2)引用类型
· 在bean中定义引用类型属性并提供可访问的set方法
public class BookServiceImpl implements BookService{
private BookDao bookDao;
//setter注入需要提供要注入对象的set方法
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}
· 配置中使用property标签ref属性注入引用类型对象
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
<!--property标签:设置注入属性-->
<!--name属性:设置注入的属性名,实际是set方法对应的名称-->
<!--ref属性:设置注入引用类型bean的id或name-->
<property name="bookDao" ref="bookDao"/>
</bean>
(2)构造器注入
1)简单类型
· 在bean中定义简单类型属性并提供可访问的构造方法
public class BookDaoImpl implements BookDao {
private String databaseName;
private int connectionNum;
public BookDaoImpl(String databaseName, int connectionNum) {
this.databaseName = databaseName;
this.connectionNum = connectionNum;
}
public void save() {
System.out.println("book dao save ..."+databaseName+","+connectionNum);
}
}
· 配置中使用constructor-arg标签ref属性注入简单类型对象
<!--标准书写-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
//根据构造方法参数名称注入
<constructor-arg name="connectionNum" value="10"/>
<constructor-arg name="databaseName" value="mysql"/>
</bean>
· 配置中使用constructor-arg标签type属性设置按形参类型注入
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
//根据构造方法参数类型注入
<constructor-arg type="int" value="10"/>
<constructor-arg type="java.lang.String" value="mysql"/>
</bean>
· 配置中使用constructor-arg标签index属性设置按形参类型注入
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
<!--根据构造方法参数位置注入-->
<constructor-arg index="0" value="mysql"/>
<constructor-arg index="1" value="100"/>
</bean>
2)引用类型
· 在bean中定义引用类型属性并提供可访问的构造方法
public class BookServiceImpl implements BookService{
private BookDao bookDao;
private UserDao userDao;
public BookServiceImpl(BookDao bookDao, UserDao userDao) {
this.bookDao = bookDao;
this.userDao = userDao;
}
public void save() {
System.out.println("book service save ...");
bookDao.save();
userDao.save();
}
}
· 配置中使用constructor-arg标签ref属性注入引用类型对象
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
<constructor-arg name="userDao" ref="userDao"/>
<constructor-arg name="bookDao" ref="bookDao"/>
</bean>
2.依赖自动装配
· 配置中使用bean标签autowire属性设置自动装配的类型
<bean class="com.itheima.dao.impl.BookDaoImpl"/>
<!--autowire属性:开启自动装配,通常使用按类型装配-->
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byType"/>
注意点:
1.自动装配用于引用类型依赖注入,不能对简单类型进行操作;
2.使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用;
3.使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用;
4.自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效。
3.集合注入
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
<!--数组注入-->
<property name="array">
<array>
<value>100</value>
<value>200</value>
<value>300</value>
</array>
</property>
<!--list集合注入-->
<property name="list">
<list>
<value>itcast</value>
<value>itheima</value>
<value>boxuegu</value>
<value>chuanzhihui</value>
</list>
</property>
<!--set集合注入-->
<property name="set">
<set>
<value>itcast</value>
<value>itheima</value>
<value>boxuegu</value>
<value>boxuegu</value>
</set>
</property>
<!--map集合注入-->
<property name="map">
<map>
<entry key="country" value="china"/>
<entry key="province" value="henan"/>
<entry key="city" value="kaifeng"/>
</map>
</property>
<!--Properties注入-->
<property name="properties">
<props>
<prop key="country">china</prop>
<prop key="province">henan</prop>
<prop key="city">kaifeng</prop>
</props>
</property>
</bean>