Spring中IOC容器
IOC入门案例思路分析
1.管理什么(Service和Dao)
2.如何将管理的对象存放到IOC容器(配置applicationContext.xml)第二步
3.将管理的对象存放到IOC容器,如何获取IOC容器 第三步
4.获取到IOC容器后,如何从容器中获取bean(即管理的对象)第四步
5.使用Spring导入坐标(pom.xml)第一步
基本内容
package com.huhu.dao;public interface BookDao {void save();
}
package com.huhu.dao.impl;import com.huhu.dao.BookDao;public class BookDaoImpl implements BookDao {public void save() {System.out.println("Bookdao save ....");}
}
package com.huhu.service;public interface BookService {void save();
}
package com.huhu.service.impl;import com.huhu.dao.BookDao;
import com.huhu.service.BookService;public class BookServiceImpl implements BookService {private BookDao bookDao=new BookDaoImpl();public void save() {System.out.println("BookService save ....");bookDao.save();}
}
第一步:导入坐标
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.10.RELEASE</version></dependency></dependencies>
第二步:配置bean
<bean id="bookDao" class="com.huhu.dao.impl.BookDaoImpl"/><bean id="bookService" class="com.huhu.service.impl.BookServiceImpl"/>
第三步:获取IOC容器和 第四步:获取bean
package com.huhu;import com.huhu.dao.BookDao;
import com.huhu.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App2 {public static void main(String[] args) {ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) ctx.getBean("bookDao");bookDao.save();System.out.println();BookService bookService = (BookService) ctx.getBean("bookService");bookService.save();}
}
实现结果:
DI 入门案例
基本内容与上面差不多,唯一修改的就是BookServiceImpl类
package com.huhu.service.impl;import com.huhu.dao.BookDao;
import com.huhu.service.BookService;public class BookServiceImpl implements BookService {private BookDao bookDao;public void save() {System.out.println("BookService save ....");bookDao.save();}public void setBookDao(BookDao bookDao) {this.bookDao = bookDao;}
}
bean配置 ref中bookDao与bookDaoImpl类注入bean定义id属性值bookDao一致
<bean id="bookDao" class="com.huhu.dao.impl.BookDaoImpl"/><bean id="bookService" class="com.huhu.service.impl.BookServiceImpl"><property name="bookDao" ref="bookDao"/></bean>
测试结果依旧不变
bean起别名添加name属性
获取bean可以使用name属性值也可以id属性值(建议id)
<bean id="bookDao" name="dao" class="com.huhu.dao.impl.BookDaoImpl"/><bean id="bookService" class="com.huhu.service.impl.BookServiceImpl"><property name="bookDao" ref="dao"/></bean>
bean作用范围配置默认单例
package com.huhu;import com.huhu.dao.BookDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) ctx.getBean("bookDao");BookDao bookDao2 = (BookDao) ctx.getBean("bookDao");System.out.println(bookDao);System.out.println(bookDao2);}
}
修改单例的话在配置文件编辑scope域=prototype
<bean id="bookDao" name="dao" class="com.huhu.dao.impl.BookDaoImpl" scope="prototype"/><bean id="bookService" class="com.huhu.service.impl.BookServiceImpl"><property name="bookDao" ref="dao"/></bean>
bean创建方式
第一种:默认无参构造方法(可不写) (private也可以被调用使用反射)一旦加了有参就必须写上无参构造方法
<bean id="bookDao" name="dao" class="com.huhu.dao.impl.BookDaoImpl"/>
public class BookDaoImpl implements BookDao {private BookDaoImpl(int i){System.out.println("Bookdao constructor is running...");}public void save() {System.out.println("Bookdao save ....");}
}
没有无参构造方法后,报错Caused by: java.lang.NoSuchMethodException: com.huhu.dao.impl.BookDaoImpl.<init>()
第二种:静态工厂 (早期使用最多,了解即可)(基本内容如下)
package com.huhu.dao;public interface OrderDao {void save();
}
package com.huhu.dao.impl;import com.huhu.dao.OrderDao;public class OrderDaoImpl implements OrderDao {public void save() {System.out.println("OrderDao save ...");}
}
package com.huhu.factory;import com.huhu.dao.OrderDao;
import com.huhu.dao.impl.OrderDaoImpl;public class OrderDaoFactory {public static OrderDao getOrderDao(){return new OrderDaoImpl();}
}
package com.huhu;import com.huhu.dao.OrderDao;
import com.huhu.factory.OrderDaoFactory;public class AppForInstanceOrder {public static void main(String[] args) {//通过静态工厂创建对象OrderDao orderDao = OrderDaoFactory.getOrderDao();orderDao.save();}
}
使用静态工厂实例化bean
<!--使用静态工厂实例化bean--><bean id="orderDao" class="com.huhu.factory.OrderDaoFactory" factory-method="getOrderDao"/>
package com.huhu;import com.huhu.dao.OrderDao;
import com.huhu.factory.OrderDaoFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class AppForInstanceOrder {public static void main(String[] args) {//通过静态工厂创建对象
// OrderDao orderDao = OrderDaoFactory.getOrderDao();
// orderDao.save();ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");orderDao.save();}
}
第三种:实例工厂 (基本内容如下)
package com.huhu.dao;public interface UserDao {void save();
}
package com.huhu.dao.impl;import com.huhu.dao.UserDao;public class UserDaoImpl implements UserDao {public void save() {System.out.println("UserDao save ...");}
}
package com.huhu.factory;import com.huhu.dao.UserDao;
import com.huhu.dao.impl.UserDaoImpl;public class UserDaoFactory {public UserDao getUserDao(){return new UserDaoImpl();}
}
package com.huhu;import com.huhu.dao.UserDao;
import com.huhu.factory.UserDaoFactory;public class AppForInstanceUser {public static void main(String[] args) {UserDaoFactory userDaoFactory = new UserDaoFactory();UserDao userDao = userDaoFactory.getUserDao();userDao.save();}
}
使用实例工厂实例化bean
<!--使用实例工厂实例化bean--><bean id="userFactory" class="com.huhu.factory.UserDaoFactory"/><bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
package com.huhu;import com.huhu.dao.UserDao;
import com.huhu.factory.UserDaoFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;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();}
}
优化创建UserDaoFactoryBean类代替UserDaoFactory类(实用)
package com.huhu.factory;import com.huhu.dao.UserDao;
import com.huhu.dao.impl.UserDaoImpl;
import org.springframework.beans.factory.FactoryBean;public class UserDaoFactoryBean implements FactoryBean<UserDao> {//代替原始实例工厂中创建对象的方法public UserDao getObject() throws Exception {return new UserDaoImpl();}//获取对象类型public Class<?> getObjectType() {return UserDao.class;}
}
<!--使用FactoryBean实例化bean--><bean id="userDao" class="com.huhu.factory.UserDaoFactoryBean"/>
bean生命周期
暴力关闭容器(实际开发不使用)
package com.huhu.dao.impl;import com.huhu.dao.BookDao;public class BookDaoImpl implements BookDao {public void save() {System.out.println("Bookdao save ....");}public void init(){System.out.println("init ...");}public void destroy(){System.out.println("destroy ...");}
}
<bean id="bookDao" name="dao" class="com.huhu.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>
ClassPathXmlApplicationContext子类型替代ApplicationContext父类型,才可关闭容器
package com.huhu;import com.huhu.dao.BookDao;
import com.huhu.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App2 {public static void main(String[] args) {ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) ctx.getBean("dao");bookDao.save();ctx.close();}
}
设置关闭钩子(哪个位置都可以)在虚拟机退出前先关闭容器在退出虚拟机
package com.huhu;import com.huhu.dao.BookDao;
import com.huhu.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App2 {public static void main(String[] args) {ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) ctx.getBean("dao");bookDao.save();
// ctx.close();ctx.registerShutdownHook();}
}
优化篇实现接口(了解即可)
<bean id="bookService" class="com.huhu.service.impl.BookServiceImpl"><property name="bookDao" ref="dao"/></bean>
package com.huhu.service.impl;import com.huhu.dao.BookDao;
import com.huhu.service.BookService;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {private BookDao bookDao;public void save() {System.out.println("BookService save ....");bookDao.save();}public void setBookDao(BookDao bookDao) {System.out.println("set...");this.bookDao = bookDao;}public void destroy() throws Exception {System.out.println("BookService destroy ...");}public void afterPropertiesSet() throws Exception {System.out.println("BookService init ...");}
}
package com.huhu;import com.huhu.dao.BookDao;
import com.huhu.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App2 {public static void main(String[] args) {ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) ctx.getBean("dao");bookDao.save();
// ctx.close();ctx.registerShutdownHook();}
}
结果如下:
总结:初始化容器
步骤:1创建对象 2执行构造方法 3执行属性注入(set)4执行bean初始化方法
使用bean:执行业务操作
关闭/销毁容器:执行bean销毁方法(容器关闭前触发bean的销毁)
Spring中IOC容器相关推荐
- 关于Spring中IOC容器和AOP协同工作的原理理解
1.在详细介绍 IOC 容器的工作原理前,这里先介绍一下实现 IOC 所用到的一些辅助类,包括BeanDefinition.BeanReference.PropertyValues.PropertyV ...
- 在servlet(或者filter或者listener)中使用spring的IOC容器
web.xml中的加载顺序为:listener >> filter >> servlet >> spring.其中filter的执行顺序是filter- mappi ...
- [Spring 深度解析]第6章 Spring的IoC容器系列
6. Spring的IoC容器系列 IoC容器为开发者管理对象之间的依赖关系提供了很多便利和基础服务.有许多IoC容器供开发者选择,SpringFramework的IoC核心就是其中一个,它是开源 ...
- 框架:简单实现Spring的IOC容器
学习过Spring的同学都知道,Spring框架的核心就是IoC和AOP.Spring可以理解为一个工厂,负责对象的创建和对象间关系的维护.IoC即控制反转,简单点说就是原来的对象是在要使用之前通过在 ...
- Spring的IOC容器为什么用反射而不用new来创建实例?
文章目录 1. 什么是反射? 2. 反射与new的区别 2. IOC为什么要使用 工厂 + 反射 创建对象? 1. 什么是反射? 反射是java的一种特性,对于任意一个类,都能够知道这个类的所有属性和 ...
- Spring中IOC和AOP的详细解释(转)
原文链接:Spring中IOC和AOP的详细解释 我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂 ...
- 【Spring】IoC容器系列的设计与实现:BeanFactory和ApplicationContext
在Spring IoC容器的设计中,我们可以看到两个主要的容器系列,一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器的最基本功能,另一个是ApplicationContext ...
- spring的IOC容器
文章目录 1. IOC.IOC容器.Bean.DI 2. 核心概念小结 3,入门案例 3.1 IOC入门案例 3.1.1 入门案例思路分析 3.1.2 入门案例代码实现 步骤1:创建Maven项目 步 ...
- 透析Spring(一): Spring之IoC容器理解
序言 记得刚毕业那会儿,出来招工作被问到Spring的核心时,都觉得简单的一笔,直接说不就是IoC(控制反转)和DI(依赖注入)么,然后省略一万字对两个名词的解释.最近空来整理了一下Spring中Io ...
最新文章
- 一个模型通杀8大视觉任务,图像、视频生成大一统!MSRA+北大全华班「女娲」模型...
- 【深度学习】基于Pytorch的卷积神经网络概念解析和API妙用(二)
- mysql主从库配置方法
- Windows校验文件哈希hash的两种常用方式
- opencv imwrite()函数中 ImwriteFlags 的 cv.IMWRITE_JPEG_RST_INTERVAL(JPEG restart interval 重启间隔)是什么?
- LeetCode 1134. 阿姆斯特朗数
- cad安装日志文件发生错误_苹果电脑Mac os系统重装时出现“准备安装时发生错误”解决方案...
- Itextpdf5 基础知识
- 韩语在线翻译图片识别_3个OCR文字识别工具,最后一个许多人都不知道!
- Log4j配置按照文件大小和日期分割日志文件
- Java开发者必备十大学习网站
- tabindex的微妙使用
- mssql查询分页存储过程SpPageOrder/proc_wuhan_getpages )
- 计算机word做课程表实验报告,《用word做课程表》教学设计
- sql 查询记录条数
- 2017年7月编程语言排行榜
- Ubuntu 16.04 安装后续要做的事
- Spring AOP---基础简介
- signature=00e3717ebf4d3479c02d1e8e6e919c84,MS12-037:Internet Explorer 的累積安全性更新:2012 年 6 月 12 日...
- 36.笔记go语言——函数