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容器相关推荐

  1. 关于Spring中IOC容器和AOP协同工作的原理理解

    1.在详细介绍 IOC 容器的工作原理前,这里先介绍一下实现 IOC 所用到的一些辅助类,包括BeanDefinition.BeanReference.PropertyValues.PropertyV ...

  2. 在servlet(或者filter或者listener)中使用spring的IOC容器

    web.xml中的加载顺序为:listener >> filter >> servlet >> spring.其中filter的执行顺序是filter- mappi ...

  3. [Spring 深度解析]第6章 Spring的IoC容器系列

    6. Spring的IoC容器系列 ​ IoC容器为开发者管理对象之间的依赖关系提供了很多便利和基础服务.有许多IoC容器供开发者选择,SpringFramework的IoC核心就是其中一个,它是开源 ...

  4. 框架:简单实现Spring的IOC容器

    学习过Spring的同学都知道,Spring框架的核心就是IoC和AOP.Spring可以理解为一个工厂,负责对象的创建和对象间关系的维护.IoC即控制反转,简单点说就是原来的对象是在要使用之前通过在 ...

  5. Spring的IOC容器为什么用反射而不用new来创建实例?

    文章目录 1. 什么是反射? 2. 反射与new的区别 2. IOC为什么要使用 工厂 + 反射 创建对象? 1. 什么是反射? 反射是java的一种特性,对于任意一个类,都能够知道这个类的所有属性和 ...

  6. Spring中IOC和AOP的详细解释(转)

    原文链接:Spring中IOC和AOP的详细解释 我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂 ...

  7. 【Spring】IoC容器系列的设计与实现:BeanFactory和ApplicationContext

    在Spring IoC容器的设计中,我们可以看到两个主要的容器系列,一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器的最基本功能,另一个是ApplicationContext ...

  8. spring的IOC容器

    文章目录 1. IOC.IOC容器.Bean.DI 2. 核心概念小结 3,入门案例 3.1 IOC入门案例 3.1.1 入门案例思路分析 3.1.2 入门案例代码实现 步骤1:创建Maven项目 步 ...

  9. 透析Spring(一): Spring之IoC容器理解

    序言 记得刚毕业那会儿,出来招工作被问到Spring的核心时,都觉得简单的一笔,直接说不就是IoC(控制反转)和DI(依赖注入)么,然后省略一万字对两个名词的解释.最近空来整理了一下Spring中Io ...

最新文章

  1. 一个模型通杀8大视觉任务,图像、视频生成大一统!MSRA+北大全华班「女娲」模型...
  2. 【深度学习】基于Pytorch的卷积神经网络概念解析和API妙用(二)
  3. mysql主从库配置方法
  4. Windows校验文件哈希hash的两种常用方式
  5. opencv imwrite()函数中 ImwriteFlags 的 cv.IMWRITE_JPEG_RST_INTERVAL(JPEG restart interval 重启间隔)是什么?
  6. LeetCode 1134. 阿姆斯特朗数
  7. cad安装日志文件发生错误_苹果电脑Mac os系统重装时出现“准备安装时发生错误”解决方案...
  8. Itextpdf5 基础知识
  9. 韩语在线翻译图片识别_3个OCR文字识别工具,最后一个许多人都不知道!
  10. Log4j配置按照文件大小和日期分割日志文件
  11. Java开发者必备十大学习网站
  12. tabindex的微妙使用
  13. mssql查询分页存储过程SpPageOrder/proc_wuhan_getpages )
  14. 计算机word做课程表实验报告,《用word做课程表》教学设计
  15. sql 查询记录条数
  16. 2017年7月编程语言排行榜
  17. Ubuntu 16.04 安装后续要做的事
  18. Spring AOP---基础简介
  19. signature=00e3717ebf4d3479c02d1e8e6e919c84,MS12-037:Internet Explorer 的累積安全性更新:2012 年 6 月 12 日...
  20. 36.笔记go语言——函数

热门文章

  1. chrome跳转IE
  2. 艾伟也谈项目管理,项目经理要如何看待技术?
  3. 关于如何学习日语的最快方法
  4. 宝塔linux面板如何开启openssl,宝塔linux面板之升级OpenSSL教程
  5. 【转载】别让自己“墙”了自己
  6. 自己写的忽略大小写查找字符串的子串的函数
  7. 软件测试基础知识回顾复习
  8. java命令行输出hello_J2SE基础之命令行中编写第一个 Hello World
  9. kafka高性能的原因
  10. 重磅!两万字长文总结,梳理 Java 入门进阶哪些事(推荐收藏)