1、/我们现在使用spring来完成上面的任务 /1.得到spring 的applicationContext对象(容器对象) ApplicationContext ac=new ClassPathXmlApplicationContext(applicationContext.xml UserService us=(UserService) ac.getBean( us.sayHello();5. 细节讨论?传统的方法和使用spring的方法 使用spring ,没有new 对象,我们把创建对象的任务交给spring框架 spring的运行原理图:5.3我们再看spring 对上面案例总结:sp
2、ring实际上是一个容器框架,可以配置各种bean(action/service/domain/dao),并且可以维护bean与bean的关系,当我们需要使用某个bean的时候,我们可以getBean(id),使用即可.ioc是什么?答 :ioc(inverse of controll ) 控制反转: 所谓控制反转就是把创建对象(bean),和维护对象(bean)的关系的权利从程序中转移到spring的容器(applicationContext.xml),而程序本身不再维护.DI是什么?答: di(dependency injection) 依赖注入: 实际上di和ioc是同一个概念,spri
3、ng设计者认为di更准确表示spring核心技术 学习框架,最重要的就是学习各个配置.把Applicationcontext做成一个单例的.上机练习: 把我写的代码走一遍. spring开发提倡接口编程,配合di技术可以层与层的解耦举例说明:现在我们体验一下spring的di配合接口编程的,完成一个字母大小写转换的案例:思路:1. 创建一个接口 ChangeLetter2. 两个类实现接口3. 把对象配置到spring容器中4. 使用通过上面的案例,我们可以初步体会到di配合接口编程,的确可以减少层(web层) 和 业务层的耦合度.思考题:接口ValidateUser有一个方法:check(?
4、)有两个类CheckUser1 implements ValidateUser check/ 安装xml验证CheckUser2 implements VallidateUsercheck()/ 到数据库去验证 从ApplicationContex 应用上下文容器中获取bean和从bean工厂容器中获取bean具体案例:/从ApplicationContext中取beanApplicationContext ac=new ClassPathXmlApplicationContext(com/hsp/ioc/beans.xml/当我们去实例化beans.xml,该文件中配置的bean被实例(该b
5、ean scope是 singleton)从bean中取出student /如果我们使用beanfactory去获取bean,当你只是实例化该容器, 那么 /容器的bean不被实例化,只有当你去使用getBean某个bean时,才会实时的创建. BeanFactory factory = new XmlBeanFactory( new ClassPathResource(); factory.getBean(student结论: 1.如果使用ApplicationContext ,则配置的bean如果是 singlton不管你用不用,都被实例化.(好处就是可以预先加载,缺点就是耗内存)2.如果
6、是 BeanFactory ,则当你获取beanfacotry时候,配置的bean不会被马上实例化,当你使用的时候,才被实例(好处节约内存,缺点就是速度)3.规定: 一般没有特殊要求,应当使用ApplicatioContext完成(90%) bean 的 scope的细节入门案例:/获取两个student Student s1=(Student) ac.getBean( Student s2=(Student) ac.getBean( System.out.println(s1+ +s2); request session global-session 是在web开发中才有意义. 三种获取Ap
7、plicationContext 对象引用的方法1. ClassPathXmlApplicationContext - 通过类路径2. FileSystemXmlApplicationContext - 通过文件路径举例:ApplicationContext ac=new FileSystemXmlApplicationContext(文件路径beans.xml / applicationContext.xml3. XmlWebApplicationContext bean的生命周期为什么总是一个生命周期当做一个重点?Servlet - servlet生命周期 init() destory()
8、java对象生命周期.往往笔试,面试总喜欢问生命周期的问题1 实例化(当我们的程序加载beans.xml文件),把我们的bean(前提是scope=singleton)实例化到内存2 调用set方法设置属性3 如果你实现了bean名字关注接口(BeanNameAware) 则,可以通过setBeanName获取id号4 如果你实现了 bean工厂关注接口,(BeanFactoryAware),则可以获取BeanFactory5 如果你实现了 ApplicationContextAware接口,则调用方法 /该方法传递ApplicationContext public void setAppli
9、cationContext(ApplicationContext arg0) throws BeansException / TODO Auto-generated method stub System.out.println(setApplicationContext+arg0); 6 如果bean 和 一个后置处理器关联,则会自动去调用 Object postProcessBeforeInitialization方法7 如果你实现InitializingBean 接口,则会调用 afterPropertiesSet8 如果自己在 则可以在bean定义自己的初始化方法.9 如果bean 和
10、一个后置处理器关联,则会自动去调用 Object postProcessAfterInitialization方法10 使用我们的bean11. 容器关闭12. 可以通过实现DisposableBean 接口来调用方法 destory13. 可以在 调用定制的销毁方法小结: 我们实际开发中往往,没有用的这么的过程,常见的是:1-2-6-10-9-11 把使用每个bean的时间记录到一个recoder.txt文件 ,内容是xxbean. 使用时间是 : 1999-11-11 11:11:11问题:通过BeanFactory来获取bean对象,bean的生命周期是否和Applicationcont
11、ext 是一样吗?不是一样的,bean是工厂中创建的生命周期会简单一些: 配置bean的细节 scope 的说明: 尽量使用 scope=”singleton” ,不要使用prototype,因为这样对我们的性能影响较大.2 如何给集合类型注入值.java中主要的集合有几种: map set list / 数组 Department类:package com.hsp.collection;import java.util.List;import java.util.Map;import java.util.Set;public class Department private String n
12、ame; private String empName; private List empList; private Set empsets; private Map empMaps; public Set getEmpsets() return empsets; public void setEmpsets(Set empsets) this.empsets = empsets; public String getEmpName() return empName; public void setEmpName(String empName) this.empName = empName; p
13、ublic String getName() return name; public void setName(String name) this.name = name; public List getEmpList() return empList; public void setEmpList(List empList) this.empList = empList; public Map getEmpMaps() return empMaps; public void setEmpMaps(Map- 给数组注入值 -empNamelist小明小明小明小明小明小明小明- 给list注入值
14、 list 中可以有相当的对象 -empListref bean=emp2 /emp1- 给set注入值 set不能有相同的对象 -empsetsset/set- 给map注入值 map只有key不一样,就可以装配value -empMapsmapentry key=11 value-ref=2233/map- 给属性集合配置 -【点http协议 referer 】pppropsprop key=pp1abcdpp2hellocom.hsp.collection.Employee北京id1天津2/beans3 内部beanbean id=”foo” class=”.Foo”property n
15、ame=”属性”第一方法引用-ref bean=bean对象名/内部bean-beanproperyt4 继承配置public class Student public class Gradate extends Student在beans.xml文件中体现配置 - 配置一个学生对象 -com.hsp.inherit.Student顺平age30- 配置Grdate对象 -grdate parent=com.hsp.inherit.Gradate- 如果自己配置属性name,age,则会替换从父对象继承的数据 -小明degree学士思考: 目前我们都是通过set方式给bean注入值,sprin
16、g还提供其它的方式注入值,比如通过构造函数注入值! 通过构造函数注入值beans.xml 关键代码:- 配置一个雇员对象 -employeecom.hsp.constructor.Employee- 通过构造函数来注入属性值 -constructor-arg index=0 type=java.lang.String大明 自动装配bean的属性值(1) byName的用法:- 配置一个master对象 -mastercom.hsp.autowire.Master autowire=byName顺平dogcom.hsp.autowire.Dog小黄3原理图:(2) byType: byType:
17、寻找和属性类型相同的bean,找不到,装不上,找到多个抛异常。(3) constructor:constructor说明 : 查找和bean的构造参数一致的一个或 多个bean,若找不到或找到多个,抛异常。按照参数的类型装配 (4) autodetectautodetect(3)和(2)之间选一个方式。不确定 性的处理与(3)和(2)一致。(5) defualt这个需要在当你在指定了 default-atuowrite后, 所有的bean的 默认的autowire就是 指定的装配方法;如果没有在context:property-placeholder location=classpath:com/hsp/dispatch/db.properties,classpath:com/hsp/dispatch/db2.properties- 配置一DBUtil对象 $占位符号 -dbutilcom.hsp.dispatch.DBUtil$namedrivername$drivernameurl$url
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1