spring打印.doc_第1页
spring打印.doc_第2页
spring打印.doc_第3页
spring打印.doc_第4页
spring打印.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二篇 spring框架一、Spring 概述l 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能.l Spring 是一个 IoC(控制反转)或称DI(依赖注入) 和 AOP 容器框架.l 轻量级. 整个大小可以打成一个 2.5 MB 的 jar 包, 而且 Spring 的处理开支也很小. 更重要的是 Spring 是非侵入性的: 基于 Spring 开发的应用中的对象可以不依赖于 Spring 的 APIl 依赖注入(DI - dependency injection)l 面向切面编程(AOP - aspect oriented programming)l 容器: Spring 是一个容器, 因为它包含并且管理应用对象的生命周期l 框架: Spring 实现了使用简单的组件配置组合成一个复杂的应用. 在 Spring 中可以使用 XML 文件组合这些对象2、 Spring 模块1. IOC(Inversion of Control)控制反转(loc):控制权的转移。Spring中IOC的基本概念是:基于OO设计原则的The Hollywood Principle:Dont call us, well call you(别找我,我会来找你的)。程序中各个组件之间的关系,不由程序代码直接操控,而由容器控制。控制权由应用代码中转到了外部容器,即所谓的反转。也就是说对象的控制权转交给spring容器。三、搭建 Spring 开发环境把以下 jar 包加入到工程的 classpath 下:distspring.jar: 该文件中包含了所有标准的 spring 模块libjakarta-commonscommons-logging.jar:spring 使用该库输出日志信息Spring 的配置文件: 一个典型的 Spring 项目需要创建一个或多个 Bean 配置文件, 这些配置文件用于在 Spring IOC 容器里配置 Bean. Bean 的配置文件可以放在 classpath 下, 也可以放在其它目录下.可以复制 samplesjpetstorewarWEB-INFapplicationContext.xml四、建立 Spring 项目HelloWorld.javabeans.xmlTest.java5、 bean 配置一、IOC控制反转public class PersonServiceBean private PersonDao personDao = new PersonDaoBean(); public void save(Person person) personDao.save(person); PersonDaoBean 是在应用程序内部创建及维护的。所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转。1、 IOC控制反转举例情况1:不使用Ioc类A:package ;public class A public String say() return hello world; 类B:A a=new A();out.print(a.say();情况2:使用IOC之一类A:package ;public class A public String say() return hello world; Beans.xml文件配置 类B:import=org.springframework.context.ApplicationContext“;import=org.springframework.context.support.ClassPathXmlApplicationContext ApplicationContext ctx = new ClassPathXmlApplicationContext(beans.xml);A a= (A)ctx.getBean(mybean);out.print(a.say();输出结果: hello world情况3:使用IOC之二(set 注入)类Apackage ;public class A private String message; public void setMessage(String message) this.message = message; public String say() return message; Beans.xml文件配置 类Bimport=org.springframework.context.ApplicationContext“;import=org.springframework.context.support.ClassPathXmlApplicationContext ApplicationContext ctx = new ClassPathXmlApplicationContext(beans.xml);A a= (A)ctx.getBean(mybean);out.print(a.say();输出结果:中国你好情况4:使用IOC之三(构造注入)类A:package ;public class A private String message; public A(String mess) this.message=mess; public String say() return message; Beans.xml文件配置 类BApplicationContext ctx = new ClassPathXmlApplicationContext(beans.xml);A a= (A)ctx.getBean(mybean);out.print(a.say();输出结果:世界你好2、 依赖注入(Dependency Injection)DI 当我们把依赖对象交给外部容器负责创建,那么PersonServiceBean 类可以改成如下:public class PersonServiceBean private PersonDao personDao ; /通过构造器参数,让容器把创建好的依赖对象注入进PersonServiceBean,当然也可以使用setter方法进行注入。 public PersonServiceBean(PersonDao personDao) this.personDao=personDao; public void save(Person person) personDao.save(person); 所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。3、spring的配置文件模版:. 该配置模版可以从spring的参考手册或spring的例子中得到。配置文件的取名可以任意,文件可以存放在任何目录下,但考虑到通用性,一般放在类路径下。4、编写spring配置文件时,不能出现帮助信息由于spring的schema文件位于网络上,如果机器不能连接到网络,那么在编写配置信息时候就无法出现提示信息,解决方法有两种:1。让机器上网,eclipse会自动从网络上下载schema文件并缓存在硬盘上。2。手动添加schema文件,方法如下:windwos-preferences-myeclipse-files and editors-xml-xmlcatalog点add,在出现的窗口中的Key Type中选择URI,在location中选File system,然后在spring解压目录的dist/resources目录中选择spring-beans-2.5.xsd,回到设置窗口的时候不要急着关闭窗口,应把窗口中的Key Type改为Schema location,Key改为/schema/beans/spring-beans-2.5.xsd5、三种实例化bean(就是一个java类,在src下配置文件中实例化)的方式1、使用类构造器实例化2、使用静态工厂方法实例化public class OrderFactory public static OrderServiceBean createOrder()return new OrderServiceBean();3、使用实例工厂方法实例化:public class OrderFactory public OrderServiceBean createOrder()return new OrderServiceBean();5.1、使用类构造器实例化5.1.1接口Package .service;public interface PersonService public void save();5.1.2实现类package ;public class PersonServiceBean implements PersonService public void save()System.out.println(我是save()方法);5.1.3使用类构造器在配置文件实例化Bean 5.2、使用静态工厂方法实例化5.2.1接口Package ;public interface PersonService public void save();5.2.2 实现类package ;public class PersonServiceBean implements PersonService public void save()System.out.println(我是save()方法);5.2.3 静态工厂类package ;public class PersonServiceBeanFactory public static PersonServiceBean createPersonServiceBean()return new PersonServiceBean();5.2.4 用静态工厂方法在配置文件实例化Bean5.3 使用实例工厂方法实例化5.3.1 接口Package ;public interface PersonService public void save();5.3.2 实现类package ;public class PersonServiceBean implements PersonService public void save()System.out.println(我是save()方法);5.3.3 工厂类package ;public class PersonServiceBeanFactory public PersonServiceBean createPersonServiceBean()return new PersonServiceBean();5.3.4使用实例工厂方在配置文件实例化Bean 6、 Bean的作用域singleton 在每个Spring IoC容器中一个bean定义只有一个对象实例。默认情况下会在容器启动时初始化bean,但我们可以指定Bean节点的lazy-init=“true”来延迟初始化bean,这时候,只有第一次获取bean会才初始化bean。如: 如果想对所有bean都应用延迟初始化,可以在根节点beans设置default-lazy-init=“true“,如下:.prototype 每次从容器获取bean都是新的对象。 .request .session .global session6.1 singleton 作用域 当一个bean的作用域设置为singleton,那么Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。换言之,当把一个bean定义设置为singleton作用域时,Spring IOC容器只会创建该bean定义的唯一实例。在beans.xml文件中配置或者 ApplicationContext ctx = new ClassPathXmlApplicationContext(beans.xml);A a1 = (A)ctx.getBean(a);A a2 = (A)ctx.getBean(a);out.println(a1=a2);/相等6.2 prototype 作用域 prototype作用域部署的bean,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)都会产生一个新的bean实例,相当于一个new的操作,对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototype bean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责。或者 ApplicationContext ctx = new ClassPathXmlApplicationContext(beans.xml);A a1 = (A)ctx.getBean(a);A a2 = (A)ctx.getBean(a);out.println(a1=a2); /不相等6.3 request、session、global session作用域request、session、global session使用的时候,首先要在初始化web的web.xml中做如下配置: 如果你使用的是Servlet 2.4及以上的web容器,那么你仅需要在web应用的XML声明文件web.xml中增加下述ContextListener即可: org.springframework.web.context.request.RequestContextListener 如果是Servlet2.4以前的web容器,那么你要使用一个javax.servlet.Filter的实现: requestContextFilter org.springframework.web.filter.RequestContextFilter requestContextFilter /* 7、指定Bean的初始化方法和销毁方法指定Bean的初始化方法和销毁方法例子public class PersonServiceBean public void init()System.out.println(初始化);public PersonServiceBean()System.out.println(我被实例化了);public void save()System.out.println(我是save()方法);public void destory()System.out.println(关闭打开的资源); AbstractApplicationContext ctx = new ClassPathXmlApplicationContext(beans.xml);ctx.close();8、 注入依赖对象8.1基本类型对象注入:/构造器注入,index表示第几个参数 /属性setter方法注入8.2 注入其他bean:8.1基本类型对象注入1、基本数据类型的set注入public class User private int userid;private String username;private String password;为此类添加getter和setter配置文件:测试类:ApplicationContext ctx = new ClassPathXmlApplicationContext(beans.xml);User user = (User)ctx.getBean(“User);2、基本数据类型的构造器注入(构造方法)为User添加构造方法public class User private int userid;private String username;private String password; User(int userid, String username, String password) this.userid = userid;this.username = username;this.password = password;配置文件多构造器时应该指定参数顺序和类型3、特殊类型数据的注入public class Student private int id;private String name;private String favor;private Set set;private List list;private Map map;private User user;添加setter 和getter数组的注入上网足球Set的注入setvalue1setvalue2List的注入listvalue1listvalue2Map的注入测试public static void main(String args) ApplicationContext context = new ClassPathXmlApplicationContext(bean.xml);Student std = (Student) context.getBean(student);System.out.println(std.getId();System.out.println(std.getName();System.out.println(std.getFavor().toString();System.out.println(std.getList();System.out.println(std.getSet();System.out.println(std.getMap();System.out.println(std.getUser();8.2 对象类型依赖注入8.2.1 接口Package ;public interface PersonDao public void add();8.2.2 实现接口类Package ;public class PersonDaoBean implements PersonDao public void add()System.out.println(执行PersonDaoBean中的add()方法);8.2.3 要注入PersonDao对象的类package ;public class PersonServiceBean private PersonDao personDao;public PersonDao getPersonDao() return personDao;public void setPersonDao(PersonDao personDao) this.personDao = personDao;public void save()personDao.add();8.2.4 对象类型依赖注入配置 /name 属性名,即PersonServiceBean类的对象变量personDao/ref 是PersonDaoBean类实例化的id名8.2.5 测试网页中导入org.springframework.context.ApplicationContext;org.springframework.context.support.ClassPathXmlApplicationContext;ApplicationContext ctx = new ClassPathXmlApplicationContext(beans.xml);PersonServiceBean personService = (PersonServiceBean)ctx.getBean(personService);personService.save();8.3依赖注入的分类使用构造器注入使用属性setter方法注入使用Field注入(用于注解方式)注入依赖对象可以采用手工装配自动装配自动扫描方式,在实际应用中建议使用手工装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。1.手工装配依赖对象2.自动装配依赖对象3.自动扫描方式依赖注入的分类-手工装配手工装配依赖对象,在这种方式中又有两种编程方式1. 在xml配置文件中,通过在bean节点下配置,如/构造器注入/属性setter方法注入2. 在java代码中使用Autowired或Resource注解方式进行装配。但我们需要在xml配置文件中配置以下信息: 这个配置隐式注册了多个对注释进行解析处理的处理器:AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor 注: Resource注解在spring安装目录的libj2eecommon-annotations.jar在java代码中使用Autowired或Resource注解方式进行装配,这两个注解的区别是:Autowired 默认按类型装配,Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。 Autowired private PersonDao personDao;/用于字段上 Autowired public void setOrderDao(OrderDao orderDao) /用于属性的setter方法上 this.orderDao = orderDao; Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。如果我们想使用按名称装配,可以结合Qualifier注解一起使用。如下: Autowired Qualifier(personDaoBean) private PersonDao personDao;Resource注解和Autowired一样,也可以标注

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论