1.初识Spring
2.Spring Dramework
2.1学习路线
-
Aop:面向切面编程
-
Aspects:AOP思想实现
-
Core Container:核心容器
-
Data Access:数据访问
-
Date Integration:数据集成
-
Web:web开发
-
Text:单元测试和集成测试
2.2核心概念
-
IoC(Inversion of Control)控制反转
-
使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转
-
-
Spring技术对IoC思想进行了实现
-
Spring提供了一个容器,称为IoC容器,用来充当IoC思想中的外部
-
IoC容器负责对象的创建,初始化等一系列工作,被创建或被管理的对象在IoC容器中统称为 Bean
-
-
DI(Dependence Injection)依赖注入
-
在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入
-
-
目标:充分解耦
-
使用IoC容器管理bean (IoC)
-
在IoC容器内将有依赖关系的bean进行关系绑定 (DI)
-
-
最终效果
-
使用对象时不仅可以直接从IoC容器中获取,并且获取到的bean已经绑定了所有的依赖关系
-
2.3IoC入门案例思路分析
-
管理什么? (Service 和Dao)
-
如何将被管理的对象告知IoC容器?(配置)
-
被管理的对象交给IoC容器,如何获取到IoC容器? (接口)
-
IoC容器得到后,如何从容器中获取bean?(接口方法)
-
使用Spring导入那些坐标? (pom.xml)
IOC入门案例
1.导入spring坐标
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.10.RELEASE</version> </dependency>
2.定义Spring管理的类(接口)
public interface BookDao { public void save(); } public class BookDaoImpl implements BookDao { public void save() { System.out.println("book dao save ..."); } }
3.创建Spring配置文件,配置对应类作为Spring管理的bean
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 1.导入spring的坐标spring-context,对应版本是5.2.10.RELEASE--> <!-- 2.配置bean bean标签表示配置bean id属性表示bean起名字 class属性表示给bean定义类型 --> <bean id="bookDao" class="com.wen.dao.impl.BookDaoImpl"></bean> <bean id="bookService" class="com.wen.service.impl.BookServiceImpl"></bean> </beans>
4.初始化IOC容器(Spring核心容器/Spring容器),通过容器获取bean
public static void main(String[] args) { //3.获取IoC容器 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); //4.获取bean(根据bean配置id获取) // BookDao bookDao = (BookDao) ctx.getBean("bookDao"); // bookDao.save(); BookService bookService = (BookService) ctx.getBean("bookService"); bookService.save(); }
2.4 DI入门案例思路分析
-
基于IoC管理bean
-
Service中使用new形式创建的Dao对象是否保留?(否)
-
Service中需要的Dao对象如何进入到Service中?(提供方法)
-
Service与Dao间的关系如何描述?(配置)
DI入门案例(XML版)
1.删除使用的new的形式创建的对象
public class BookServiceImpl implements BookService{ private BookDao bookDao = new BookDaoImpl(); public void save(){ bookDao.save(); } }
2.提供依赖对象对应的setter方法
public class BookServiceImpl implements BookService { //5.删除业务层中使用new的方式创建的dao对象 private BookDao bookDao; public void save() { System.out.println("book service save ..."); bookDao.save(); } //6.提供对应的set方法 public void setBookDao(BookDao bookDao) { this.bookDao = bookDao; } }
3.配置service与dao之间的关系
<bean id="bookDao" class="com.wen.dao.impl.BookDaoImpl"/> <bean id="bookService" class="com.wen.service.impl.BookServiceImpl"> <!-- 7.配置service与dao的关系 property标签表示配置当前的bean name的属性表示配置哪一个具体的属性(方法) ref表示这个属性(方法)参考哪一个bean --> <property name="bookDao" ref="bookDao"/> </bean>
3.1bean作用范围说明
-
为什么bean默认为单例?
-
适合给容器进行管理的bean
-
表现层对象
-
业务层对象
-
数据层对象
-
工具对象
-
-
不适合交给容器的进行管理的bean
-
封装实体的域对象
-
3.2bean实例化
-
bean本质上就是对象,创建bean使用构造方法完成
实例化bean的三种构造方法
1.提供可访问 的构造方法
public class BookDaoImpl implements BookDao { // public BookDaoImpl() { // System.out.println("book dao constructor is running ...."); // } public void save() { System.out.println("book dao save ..."); } }
-
配置
<bean id="bookDao" class="com.wen.dao.impl.BookDaoImpl"/>
-
无参构造方法如果不存在,,将抛出异常BeanCreationException
2.静态工厂
public class OrderDaoFactory{ public static OrderDao getOrderDao(){ return new OrderDaoImpl(); } }
-
配置
<bean id = "orderDao" factory-method = "getOrderDao" class="com.wen.factory.OrderDaoFactory" />
3.实例工厂
-
FactoryBean
public class UserDaoFactoryBean implement FactoryBean<UserDao>{ public UserDao getObject() throws Exception{ return new UserDaoImpl(); } public Class<?> getObjectType(){ return UserDao.class; } }
-
配置
<!-- 方式四:使用FactoryBean实例化bean--> <bean id="userDao" class="com.wen.factory.UserDaoFactoryBean"/>
3.3bean生命周期
-
生命周期:从创建到消亡的完整过程
-
bean生命周期:bean从创建到消亡的整体过程
-
bean生命周期控制:在bean创建后到销毁前做一些事情
-
初始化容器
-
创建对象(内存分配)
-
执行构造方法
-
执行属性注入(set操作)
-
执行bean初始化方法
-
-
使用bean
-
执行业务操作
-
-
关闭销毁bean
-
执行bean销毁方法
-
3.4bean生命周期控制
-
提供生命周期控制方法
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 destroy(){ System.out.println("destory..."); } }
-
配置生命周期控制方法
<bean id="bookDao" class="com.wen.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>
-
接口控制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"); } }g
关闭容器
-
close()
-
registerShutdownHook()
-
4.1依赖注入
-
思考:向一个类中传递数据的方式有几种?
-
普通方法(set方法)
-
构造方法
-
-
思考:依赖注入描述了在容器中建立bean与bean之间依赖关系的过程,如果bean运行需要的是数字或是字符串呢?
-
引用类型
-
简单类型(基本数据类型与String)
-
-
依赖注入方式
-
setter注入
-
简单类型
-
引用类型
-
-
构造器注入
-
简单类型
-
引用类型
-
-
setter注入---简单类型
-
在bean中定义引用类型属性并提供可访问的set方法
private String databaseName; public void setDatabaseName(String databaseName) { this.databaseName = databaseName; }
-
配置中使用property标签value属性注入简单类型数据
<bean id="bookDao" class="com.wen.dao.impl.BookDaoImpl"> <property name="databaseName" value="mysql"/> </bean>
构造器注入---引用类型(了解)
-
在bean中定义引用类型属性并提供可访问的构造方法
public class BookServiceImpl implements BookService{ private BookDao bookDao; private UserDao userDao; public BookServiceImpl(BookDao bookDao, UserDao userDao) { this.bookDao = bookDao; this.userDao = userDao; } }
-
配置中使用constructor-arg标签ref属性注入引用类型对象
<bean id="userDao" class="com.wen.dao.impl.UserDaoImpl"/> <bean id="bookService" class="com.wen.service.impl.BookServiceImpl"> <constructor-arg name="bookDao" ref="bookDao"/> <constructor-arg name="userDao" ref="userDao"/>
构造器注入--简单类型(了解)
-
在bean中定义引用类型属性并提供可访问的set方法
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标签value属性注入简单类型数据
<!-- <bean id="bookDao" class="com.wen.dao.impl.BookDaoImpl">--> <!-- <constructor-arg name="connectionNum" value="100"/>--> <!-- <constructor-arg name="databaseName" value="mysql"/>--> <!-- </bean>-->
4.2依赖自动装配
-
Ioc容器根据bean所依赖的资源在容器中自动查找并注入到bean的过程叫自动装配
-
自动装配方式
-
按类型
-
按名称
-
按构造方法
-
配置中使用bean标签autowire属性设置自动装配的类型
<bean id="userDao" class="com.wen.dao.impl.BookDaoImpl"/> <bean id="bookService" class="com.wen.service.impl.BookServiceImpl" autowire="byType"/>
4.3集合注入
<property name="array"> <array> <value>100</value> <value>200</value> <value>300</value> </array> </property> <property name="list"> <list> <value>pp</value> <value>kk</value> <value>jj</value> </list> </property> <property name="set"> <set> <value>100</value> <value>200</value> <value>300</value> <value>300</value> </set> </property> <property name="map"> <map> <entry key="country" value="china"/> <entry key="province" value="shanxi"/> <entry key="city" value="xin"/> </map> </property> <property name="properties"> <props> <prop key="country">china</prop> <prop key="province">shanxi</prop> <prop key="city">xin</prop> </props> </property>
5.1第三方资源配置管理
导入druid坐标
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency>
配置数据源对象作为spring管理的bean
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc//:mysql://localhost:3306/spring_db"/> <property name="username" value="root"/> <property name="password" value="root"/> </bean>
5.2加载properties配置信息
开启context命名空间
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
使用context命名空间,加载指定properties文件
2.使用context空间加载properties文件 --> <context:property-placeholder location="jdbc.properties"/>
<!-- 3.使用属性站位符${}读取properties中的属性--> <bean class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <bean id="bookDao" class="com.wen.dao.impl.BookDaoImpl"> <property name="name" value="${}"/> </bean>
6.1容器
创建
-
ClassPathXmlApplicationContext
-
FileSystemXmlApplicationContext
BeanFactory是Ioc容器的顶层接口,初始化BeanFactory对象时,加载的bean延迟加载 (lazy-init="true")
ApplicationContext接口是Spring容器的核心接口,初始化bean立即加载
ApplicationContext接口提供基础的bean操作相关方法,通过其他接口扩展其功能