最简单的单页网站怎么做,玩具 网站模板,网站的关键词怎么选择,修改wordpress登录文章目录 一.概念实操Maven父子工程 二. IOC和DI入门案例【重点】1 IOC入门案例【重点】问题导入1.1 门案例思路分析1.2 实现步骤2.1 DI入门案例思路分析2.2 实现步骤2.3 实现代码2.4 图解演示 三、Bean的基础配置问题导入问题导入1 Bean是如何创建的【理解】2 实例化Bean的三种… 文章目录 一.概念实操Maven父子工程 二. IOC和DI入门案例【重点】1 IOC入门案例【重点】问题导入1.1 门案例思路分析1.2 实现步骤2.1 DI入门案例思路分析2.2 实现步骤2.3 实现代码2.4 图解演示 三、Bean的基础配置问题导入问题导入1 Bean是如何创建的【理解】2 实例化Bean的三种方式2.1 构造方法方式【重点】2.2 静态工厂方式2.3 实例工厂方式2.4 实现FactoryBean\T方式【扩展,了解】 五、依赖注入(DI配置)1 依赖注入方式【重点】问题导入1.1 依赖注入的两种方式1.2 setter方式注入问题导入引用类型简单类型 1.3 构造方式注入问题导入引用类型简单类型参数适配【了解】 1.4 依赖注入方式选择 2 依赖自动装配【理解】问题导入2.1 自动装配概念2.2 自动装配类型依赖自动装配依赖自动装配特征 3 集合注入3.1 注入数组类型数据3.2 注入List类型数据3.3 注入Set类型数据3.4 注入Map类型数据3.5 注入Properties类型数据 六、Bean的生命周期【了解】问题导入1 生命周期相关概念介绍2 代码演示2.1 Bean生命周期控制2.2 Bean生命周期控制 3 Bean销毁时机 思维导图 一.概念
最核心的一个特性IoC控制反转、DI依赖注入。IoC和DI你可以理解为是同一个功能的两种表述方式。
控制反转之前由开发人员应用程序负责去创建对象但是现在交由Spring的IoC容器负责去创建实例对象这个过程有一个反转称之为控制反转。之前在项目一中我们使用Service实现类我们都是自己去创建该实例对象但是借助于SpringIoC容器之后我们将对象的创建交给Spring容器去做你需要做的事情就是从Spring容器中获取该实例对象即可。 依赖注入比如说UserServiceImpl对象中持有一个应用userDao如果我们将userServiceImpl和userDao实现类全部都放入到Spring容器中之后Spring会负责将userDao实例对象注入到userServiceImpl对象中。当我们从容器中取出userServiceImpl实例时它已经和userDao产生了关联。 三层架构中的组件全部都会交给Spring容器去管理维护我们需要做的事情其实无外乎就三件事
1.需要告诉Spring容器需要将哪些对象的创建工厂交给Spring容器去执行
2.需要告诉Spring容器帮助我们维护对象和对象之间的依赖关系
3.在需要使用到某个对象时我们利用它提供的方法从容器中获取对应的实例对象即可 实操
Maven父子工程
首先创建一个父工程父工程主要的作用是引入依赖那么接下来所有的子工程可以通过继承的方式获取该依赖这样便无需反复地去导入依赖。创建出来的父工程只需要一个pom.xml文件即可其他的目录可以把它删除。 二. IOC和DI入门案例【重点】
resources目录下新建一个xml文件内容如下
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!--我的诉求是希望Spring容器可以帮助我们创建userServiceImpl对象和userDaoImpl对象--bean iduserService classcom.code.service.UserServiceImpl/bean iduserDao classcom.code.dao.UserDaoImpl/bean iduserDao2 classcom.code.dao.UserDaoImpl//beans1 IOC入门案例【重点】
问题导入
bean标签中id属性和class属性的作用是什么
1.1 门案例思路分析
管理什么(Service与Dao)如何将被管理的对象告知IOC容器(配置文件)被管理的对象交给IOC容器如何获取到IoC容器(接口)IOC容器得到后如何从容器中获取bean(接口方法)使用Spring导入哪些坐标(pom.xml)
1.2 实现步骤 【第一步】导入Spring坐标 【第二步】定义Spring管理的类接口 【第三步】创建Spring配置文件配置对应类作为Spring管理的bean对象 【第四步】初始化IOC容器Spring核心容器/Spring容器通过容器获取bean对象 1.3 实现代码 【第一步】导入Spring坐标
dependencies!--导入spring的坐标spring-context对应版本是5.2.10.RELEASE--dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.2.10.RELEASE/version/dependency
/dependencies【第二步】定义Spring管理的类接口
BookDao接口和BookDaoImpl实现类
public interface BookDao {public void save();
}public class BookDaoImpl implements BookDao {public void save() {System.out.println(book dao save ...);}
}【第三步】创建Spring配置文件配置对应类作为Spring管理的bean对象*
定义applicationContext.xml配置文件并配置BookServiceImpl
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!--bean标签表示配置beanid属性表示给bean起名字class属性表示给bean定义类型--bean idbookService classcom.code.service.impl.BookServiceImpl/bean/beans注意事项bean定义时id属性在同一个上下文中(IOC容器中)不能重复
【第四步】初始化IOC容器Spring核心容器/Spring容器通过容器获取Bean对象
public class App {public static void main(String[] args) {//1.创建IoC容器对象加载spring核心配置文件ApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml);//2 从IOC容器中获取Bean对象(BookService对象)BookService bookService (BookService)ctx.getBean(bookService);//3 调用Bean对象(BookService对象)的方法bookService.save();}
}1.4 运行结果
2.1 DI入门案例思路分析
基于IOC管理beanService中使用new形式创建的Dao对象是否保留(否)Service中需要的Dao对象如何进入到Service中(提供方法)Service与Dao间的关系如何描述(配置)
2.2 实现步骤
【第一步】删除使用new的形式创建对象的代码
【第二步】提供依赖对象对应的setter方法
【第三步】配置service与dao之间的关系2.3 实现代码
环境代码
BookService接口和BookServiceImpl实现类
public interface BookService {public void save();
}public class BookServiceImpl implements BookService {private BookDao bookDao new BookDaoImpl();public void save() {System.out.println(book service save ...);bookDao.save();}
}【第一步】删除使用new的形式创建对象的代码
public class BookServiceImpl implements BookService {private BookDao bookDao; //【第一步】删除使用new的形式创建对象的代码public void save() {System.out.println(book service save ...);bookDao.save();}
}【第二步】提供依赖对象对应的setter方法
public class BookServiceImpl implements BookService {private BookDao bookDao;public void save() {System.out.println(book service save ...);bookDao.save();}//【第二步】提供依赖对象对应的setter方法public void setBookDao(BookDao bookDao) {this.bookDao bookDao;}
}【第三步】配置service与dao之间的关系 在applicationContext.xml中配置 ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!--bean标签表示配置beanid属性表示给bean起名字class属性表示给bean定义类型--bean idbookDao classcom.itheima.dao.impl.BookDaoImpl/bean idbookService classcom.itheima.service.impl.BookServiceImpl!--配置server与dao的关系property标签表示配置当前bean的属性name属性表示配置哪一个具体的属性ref属性表示参照哪一个bean--property namebookDao refbookDao//bean
/beans2.4 图解演示 三、Bean的基础配置
问题导入
问题1在bean标签上如何配置别名
问题2Bean的默认作用范围是什么如何修改
1 Bean基础配置【重点】
配置说明! 2 Bean别名配置 配置说明 代码演示 打印结果 3 Bean作用范围配置【重点】 扩展scope的取值不仅仅只有singleton和prototype还有request、session、application、 websocket 表示创建出的对象放置在web容器(tomcat)对应的位置。比如request表示保存到request域中。 代码演示 打印结果 四、Bean的实例化 问题导入
Bean的实例化方式有几种
1 Bean是如何创建的【理解】
bean本质上就是对象创建bean使用构造方法完成
2 实例化Bean的三种方式
2.1 构造方法方式【重点】
BookDaoImpl实现类
public class BookDaoImpl implements BookDao {public BookDaoImpl() {System.out.println(book dao constructor is running ....);}public void save() {System.out.println(book dao save ...);}
}applicationContext.xml配置
!--方式一构造方法实例化bean--
bean idbookDao classcom.code.dao.impl.BookDaoImpl/AppForInstanceBook测试类
public class AppForInstanceBook {public static void main(String[] args) {ApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml);BookDao bookDao (BookDao) ctx.getBean(bookDao);bookDao.save();}
}运行结果 注意无参构造方法如果不存在将抛出异常BeanCreationException
2.2 静态工厂方式
2.2 静态工厂方式
OrderDao接口和OrderDaoImpl实现类
public interface OrderDao {public void save();
}
public class OrderDaoImpl implements OrderDao {public void save() {System.out.println(order dao save ...);}
}OrderDaoFatory工厂类
//静态工厂创建对象
public class OrderDaoFactory {public static OrderDao getOrderDao(){System.out.println(factory setup....);return new OrderDaoImpl();}
}applicationContext.xml配置
!--方式二使用静态工厂实例化bean--
bean idorderDao classcom.itheima.factory.OrderDaoFactory factory-methodgetOrderDao/AppForInstanceOrder测试类
public class AppForInstanceOrder {public static void main(String[] args) {ApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml);OrderDao orderDao (OrderDao) ctx.getBean(orderDao);orderDao.save();}
}运行结果 2.3 实例工厂方式
UserDao接口和UserDaoImpl实现类
public interface UserDao {public void save();
}
public class UserDaoImpl implements UserDao {public void save() {System.out.println(user dao save ...);}
}UserDaoFactory工厂类
//实例工厂创建对象
public class UserDaoFactory {public UserDao getUserDao(){return new UserDaoImpl();}
}applicationContext.xml配置
!--方式三使用实例工厂实例化bean--
bean iduserFactory classcom.itheima.factory.UserDaoFactory/bean iduserDao factory-methodgetUserDao factory-beanuserFactory/AppForInstanceUser测试类
public class AppForInstanceUser {public static void main(String[] args) {// //创建实例工厂对象// UserDaoFactory userDaoFactory new UserDaoFactory();// //通过实例工厂对象创建对象// UserDao userDao userDaoFactory.getUserDao();// userDao.save();ApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml);UserDao userDao (UserDao) ctx.getBean(userDao);userDao.save();}
}运行结果 2.4 实现FactoryBeanT方式【扩展,了解】
定义UserDaoFactoryBean实现FactoryBeanUserDao UserDaoFactoryBean中实例化什么类型的对象泛型就是该类型。 //FactoryBean创建对象
public class UserDaoFactoryBean implements FactoryBeanUserDao {//代替原始实例工厂中创建对象的方法public UserDao getObject() throws Exception {return new UserDaoImpl();}public Class? getObjectType() {return UserDao.class;}
}applicationContext.xml配置
!--方式四使用FactoryBean实例化bean--
bean iduserDao classcom.itheima.factory.UserDaoFactoryBean/使用之前的AppForInstanceUser测试类去运行看结果就行了。注意配置文件中iduserDao是否重复。 五、依赖注入(DI配置)
1 依赖注入方式【重点】
问题导入
依赖注入有几种方式
1.1 依赖注入的两种方式
setter注入 简单类型 引用类型(很常用)构造器注入 简单类型 引用类型
1.2 setter方式注入
问题导入
setter方式注入使用什么子标签
引用类型 简单类型 1.3 构造方式注入
问题导入
构造方式注入使用什么子标签
引用类型 简单类型 参数适配【了解】 1.4 依赖注入方式选择
强制依赖使用构造器进行使用setter注入有概率不进行注入导致null对象出现可选依赖使用setter注入进行灵活性强Spring框架倡导使用构造器第三方框架内部大多数采用构造器注入的形式进行数据初始化相对严谨如果有必要可以两者同时使用使用构造器注入完成强制依赖的注入使用setter注入完成可选依赖的注入实际开发过程中还要根据实际情况分析如果受控对象没有提供setter方法就必须使用构造器注入自己开发的模块推荐使用setter注入
2 依赖自动装配【理解】
问题导入
如何配置按照类型自动装配
2.1 自动装配概念
IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配自动装配方式 按类型常用 按名称 按构造方法 不启用自动装配
2.2 自动装配类型
依赖自动装配 配置中使用bean标签autowire属性设置自动装配的类型 bean idbookDao classcom.code.dao.impl.BookDaoImpl/
bean idbookService classcom.itheima.service.impl.BookServiceImpl autowirebyType/依赖自动装配特征
自动装配用于引用类型依赖注入不能对简单类型进行操作使用按类型装配时byType必须保障容器中相同类型的bean唯一推荐使用使用按名称装配时byName必须保障容器中具有指定名称的bean因变量名与配置耦合不推荐使用自动装配优先级低于setter注入与构造器注入同时出现时自动装配配置失效
3 集合注入
3.1 注入数组类型数据
property namearrayarrayvalue100/valuevalue200/valuevalue300/value/array
/property3.2 注入List类型数据
property namelistlistvalueitcast/valuevalueitheima/valuevalueboxuegu/valuevaluechuanzhihui/value/list
/property3.3 注入Set类型数据
property namesetsetvalueitcast/valuevalueitheima/valuevalueboxuegu/valuevalueboxuegu/value/set
/property3.4 注入Map类型数据
property namemapmapentry keycountry valuechina/entry keyprovince valuehenan/entry keycity valuekaifeng//map
/property3.5 注入Properties类型数据
property namepropertiespropsprop keycountrychina/propprop keyprovincehenan/propprop keycitykaifeng/prop/props
/property说明property标签表示setter方式注入构造方式注入constructor-arg标签内部也可以写array、list、set、map、props标签 六、Bean的生命周期【了解】
问题导入
问题1多例的Bean能够配置并执行销毁的方法
问题2如何做才执行Bean销毁的方法
1 生命周期相关概念介绍
生命周期从创建到消亡的完整过程bean生命周期bean从创建到销毁的整体过程bean生命周期控制在bean创建后到销毁前做一些事情
2 代码演示
2.1 Bean生命周期控制
提供生命周期控制方法
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...);}
}applicationContext.xml配置
!--init-method设置bean初始化生命周期回调函数,此处填写init方法名--
!--destroy-method设置bean销毁生命周期回调函数仅适用于单例对象此处填写destory方法名--
bean idbookDao classcom.itheima.dao.impl.BookDaoImpl init-methodinit destroy-methoddestory/测试类
public class AppForLifeCycle {public static void main( String[] args ) {//此处需要使用实现类类型接口类型没有close方法ClassPathXmlApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml);BookDao bookDao (BookDao) ctx.getBean(bookDao);bookDao.save();//关闭容器执行销毁的方法ctx.close();}
}2.2 Bean生命周期控制
实现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);}
}测试类代码同《3.2.1 Bean生命周期控制》中的测试代码 3 Bean销毁时机
容器关闭前触发bean的销毁关闭容器方式 手工关闭容器 ConfigurableApplicationContext接口close()操作注册关闭钩子在虚拟机退出前先关闭容器再退出虚拟机 ConfigurableApplicationContext接口registerShutdownHook()操作
public class AppForLifeCycle {public static void main( String[] args ) {//此处需要使用实现类类型接口类型没有close方法ClassPathXmlApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml);BookDao bookDao (BookDao) ctx.getBean(bookDao);bookDao.save();//注册关闭钩子函数在虚拟机退出之前回调此函数关闭容器ctx.registerShutdownHook();//关闭容器//ctx.close();}
}能够说出Spring的体系结构 能够编写IOC入门案例 能够编写DI入门案例 能够配置setter方式注入属性值 能够配置构造方式注入属性值 能够理解什么是自动装配
思维导图