• 1. 第 二 章 Spring IOC
  • 2. 什么是接口这个一个老问题,也是个新问题,取决你的认识 抛开你以前对接口的理解,请记住一句话:接口是一种身份的象征2
  • 3. 考虑以下对象public class Person { private String name; private int age; public void eat(String food) { System.out.println(name + "正在吃" + food); } public void sleep() { System.out.println(name + "正在睡大觉"); } }Person是一个普通 对象,不具有任何 特征3
  • 4. 考虑以下接口public interface Salesman { public void sell(String goods); }public interface Housework { public void doIt(String work); }Salesman是一个销售人员 接口,具有这个接口的 类都会推销的技能Housework是一个家务人员 接口,具有这个接口的 类都必须会做家务4
  • 5. public class Person implements Housework, Salesman { private String name; private int age; 。。。 public void doIt(String work) { System.out.println(name + "正在做" + work); } public void sell(String goods) { System.out.println(name + "正在销售" + goods); } }当一个类实现了一个接口,那么 它就具有了一种新的身份 如果它实行了多个接口,它 就具有了多重身份5
  • 6. 那么实现接口的意义是?在商店,就(可以)把你当做销售人员用 在家,就(可以)把你当劳力用6
  • 7. 举一些实际的例子现在person1和person2都可以胜任销售人员用,但是只有一个职位,商场可以先雇佣一个销售人员,以后遇到好的再换。 SalesmanPerson1Person2商场人才市场7
  • 8. 不好的选择如果变成商场招聘的不是一个“职位”,而是一个具体的人(可以想象商场老板任人唯亲),那么即使人才市场有更优秀的李四、王五,那么替换掉张三是很难的张三李四商场人才市场王五 它们不是老板 的亲戚8
  • 9. 用在实际设计中业务逻辑接口实现类A实现类BAction业务实现包9
  • 10. 但还有一点没有考虑到由谁去筛选人才?SalesmanPerson1Person2商场人才市场10
  • 11. 商场市场部人事部SalesmanPerson2人才市场Person1Person2选拔任命11
  • 12. 这里人事部的职责就是负责产生销售人员 再次提醒大家,不是产生具体对象,而是产生一个身份(某种职务) 在编程技术里,称人事部为:对象工厂 在Spring里,就对应着各种BeanFactory12
  • 13. 什么是IoCIoC即控制反转,有时候也叫做DI(依赖注入) 举报纸的例子 举商场的例子 13
  • 14. 考虑下列情形是自己到报摊买报纸好 还是在邮局订阅,让人给送来好?14
  • 15. 考虑下列情形商场的例子里,是老板亲自去选拔、任命销售人员 还是老板下一个命令,让手下的人把这件事办妥了?15
  • 16. 对于下面的例子public class HelloImpl4 implements Hello { private Message msg; public Message getMsg() { return msg; } public void setMsg(Message msg) { this.msg = msg; } public String sayHello(String name) { return this.msg.getMsg() + " " + name; } }HelloImpl4这个类需要 用到Message类 那么, 是由HelloImpl4自己 实例化Message类呢 还是最好有人把 Message类实例化 好了,给它送过来呢 16
  • 17. 实现注入的步骤A.在配置文件中声明好要注入的类 要注入的类定义17
  • 18. B.选择注入的方式常用的注入的方式有两种 构造方法注入 Setter方法注入18
  • 19. 对于构造注入public class HelloImpl4 implements Hello { private Message msg; public HelloImpl4(Message msg) { this.msg = msg; } 20. 对于Setter方法注入public class HelloImpl4 implements Hello { private Message msg; public void setMsg(Message msg) { this.msg = msg; } 被注入的属性 由Spring注入20
  • 21. C.使用被注入的类BeanFactory factory = new XmlBeanFactory(resource); Hello hello = (Hello) factory.getBean("hello4"); hello.sayHello("Spring");public String sayHello(String name) { return this.msg.getMsg() + " " + name; }msg属性的值在使用前 已经在getBean()的 过程中被注入好了21
  • 22. 举例演示spring中如何使用hibernate的session factory 请同学回答,在这个例子里,谁依赖于谁,谁被注入了? 还要注意通过这个例子,掌握属性类型为Properties和数组时怎么注入 22
  • 23. 开拓思路 业务实现类业务接口使用者数据访问类A数据访问类B数据访问类C23
  • 24. 开拓思路 业务实现类 数据访问类A 数据访问类B 数据访问类C 业务接口使用者 业务接口数据访问类A数据访问类B数据访问类C给业务实现类 添加属性给使用者类 添加属性24
  • 25. 开拓思路 业务实现类 数据访问类A 数据访问类B 数据访问类C 业务接口使用者 业务接口数据访问类A数据访问类B数据访问类C由Spring注入 这些属性由Spring注入 这些属性25
  • 26. 其他可以把所有的Bean理解为Matrix这个虚拟世界的生活着的人(相信都看过黑客帝国),他们并不知道自己的真实身份,也不知道真实世界(Spring)的存在 如果想知道自己是谁,需要实现BeanNameAware接口,有了这个接口,这个Bean就成为了崔妮绨、墨非司那种身份的人 如果想去创造这个世界,需要实现BeanFactoryAware接口,有了这个接口,这个Bean就可以成为neo(尼奥)救世主 26
  • 27. 作业使用Spring的BeanFactory和配置文件改写Hello项目27