spring--day01笔记.doc_第1页
spring--day01笔记.doc_第2页
spring--day01笔记.doc_第3页
spring--day01笔记.doc_第4页
spring--day01笔记.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1 框架介绍struts:学习的第一个框架,思想转变,完全自己编写,转型到,框架完成部分。基于xml配置文件。hibernate:hbm配置,优化配置等,配置量大。spring:理解思想(IoC控制反转、DI依赖注入、AOP切面编程)额外添加的spring xml文件 可以去包含其他的配置文件,在开发中比较常见。每一个模块使用单独一个配置文件 。2 spring入门2.1 回顾service中使用dao方式l 方式1:没有接口,只有类类:UserService、UserDaoclass UserService private UserDao userDao = new UserDao(); .l 方式2:接口 + 实现类接口:UserService、UserDao实现类:UserServiceImpl、UserDaoImplclass UserServiceImpl implements UserService private UserDao userDao = new UserDaoImpl(); .l 方式3:接口 + 实现类 + 工厂接口:UserService、UserDao实现类:UserServiceImpl、UserDaoImplclass UserServiceImpl implements UserService private UserDao userDao = new UserDaoImpl(); BeanFactory.getBean() .class BeanFactory public static UserDao getBean() return new UserDaoImpl(); /读取配置文件,获得dao实现类全限定类名,通过反射实例化。 解决问题:service和dao解耦(没有关系)。* 耦合:模块与模块之间的关系* 内聚:类似功能应该存在一起* 高内聚低耦合:讲所有的类似存放一起,模块之间关系越少越好。引出问题:问题1,service和工厂耦合。问题2,工厂与dao耦合* 问题2:工厂 与 dao解耦:将dao实现类存放到配置文件中。 xml 反射:Class.forName(cn.itcast.UserDaoImpl).newInstance(); /工厂在newl 本身自己new实例,但此时通过配置文件,让工厂去new,IoC ( inverse of control) 控制反转l 控制反转IoC:将创建对象实例交于spring容器,不在由自己创建。将对象交于spring,此对象之后都称之为:bean2.2 什么是spring轻量级:与重量级(EJB)对比。使用spring依赖程序很少。spring是一种解决方案,用于全站式开发。提供了软件开发,分层中不同层解决方案。web层:struts、spring MVCservice层:spring (权限管理、事务管理等)dao层:hibernate、JdbcTemplate2.3 spring好处2.4 体系结构spring核心组件:beans、core、context、expression2.5 版本核心:spring-framework-3.2.0.RELEASE依赖:spring-framework-3.0.2.RELEASE-dependencies ,从3.0.2之后再不提供依赖包。maven解决项目jar依赖的。不需要手动的下载jar包。3 hello world(必须练习)注意:编写hello world之前,必须理解IoC概念。3.1 步骤1.导入jar包2.编写spring配置文件3从spring容器获得实例对象,操作api3.2 导入jar包导入4个核心组件,以及一个依赖jar3.3 编写配置文件l 位置:任意包,开发是src下l 名称:任意,建议:applicationContext.xml l 添加约束位置:spring-framework-3.2.0.RELEASEdocsspring-framework-referencehtmlxsd-config.htmll 内容3.4 api使用Testpublic void demo02()String xmlPath = cn/itcast/a_hello/beans.xml;/ 1 获得spring容器ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);/ 2 从容器通过名称获得实例UserDao userDao = (UserDao)applicationContext.getBean(userDaoId);userDao.sayHello();4 依赖注入DI(必须练习)l DI :Dependency Injection,依赖注入。依赖:A类使用B类,我们就成A类依赖与B类。依赖注入:A类使用B类,将自动创建B类实例,自动设置给A类例如:UserService 需要使用 UserDao,当从spring容器获得UserService时,spring将自动的创建UserDao,并设置给UserService。此时UserService不需要任何操作就可以使用UserDao。l service提供setterpublic class BookServiceImpl implements BookService /方式2:类 + 接口/private BookDao bookDao = new BookDaoImpl();/方式4 依赖注入,service使用dao将由工厂自动创建并设置。提供接口对应setter方法private BookDao bookDao;public void setBookDao(BookDao bookDao) this.bookDao = bookDao;Overridepublic void addBook() this.bookDao.save();l spring配置5 自动提示l 确定schema文档位置l myeclipse配置 schema6 BeanFactory 和 ApplicationContext(多读)l BeanFactory,spring提供用于管理所有bean的工厂。用于生产bean。l ApplicationContext,spring提供的bean容器,用于生产bean。l ApplicationContext在加载完成配置文件时,默认将容器中所有的bean都进行实例化,之后调用getBean时直接获得即可。l BeanFactory 加载配置文件时不进行实例化,实例化延迟。直到第一次调用getBean时才实例化。7 装配bean基于xml7.1 bean实例化方式l 方式1:使用构造方式(默认构造方法)l 方式2:静态工厂,一般情况用于整合其他框架或工具。 public class MyBeanFactory1 /* * 工厂提供实例 * return */public static Demo1 createDemo()return new Demo1();l 方式3:实例工厂,用工厂之前,必须先new工厂。public class MyBeanFactory2 /* * 要执行createDemo()方法,必须new MyBeanFactory2() * return */public Demo2 createDemo()return new Demo2();7.2 Bean种类l 分类两种:普通bean、工厂beanl 普通bean:没有任何要求,之前使用都是普通beanl 工厂bean:特殊的bean (MyFactory),用于生成指定的bean(myBean)。必须实现接口FactoryBean,此接口提供getObject()方法用于返回指定的bean实例。spring aop底层使用就是工厂bean。默认情况:创建class指定实例,并返回。MyFactory factory = new MyFactory()/ 但如果实现接口FactoryBean,将执行当前实例的getObject方法,将其指定的内容返回。if( factory instanceof FactoryBean) /运行时判定具体类型 /强转 FactoryBean factoryBean = (.)factory; /执行getObject return factoryBean.getObject();return factory;对比:BeanFactory 、FactoryBeanl BeanFactory:这是一个工厂,用于生成bean,生成任意bean。l FactoryBean:这是一个bean,功能生成指定bean,生成一个指定bean。指定的bean,一般都是代理对象。有代理就可以增强。7.3 id和name属性l xml配置中id属性:理论使用约束的ID,要求:唯一、不能数字开头、不能使用特殊字符。实际:不能重复,可以使用特殊字符和数字。name属性:理论名称可以重复,后面覆盖前面的。可以设置多个名称。实际:可以设置多个名称 name=名称1,名称2,名称3,. ,但不能重复。id 有提示,name没有,一般情况使用id属性。7.4 bean作用域singleton:单例,默认值,保证spring容器创建对象实例只有一份。prototype:多例。每一次执行getBean() 都将创建bean实例。例如:整合struts action 需要多例。request,一次请求session,一次回话globalSession,集群环境掌握:singleton,prototype使用:7.5 bean生命周期7.5.1 初始化和销毁l bean 确定方法,名称自定义public class CategoryDao public void save()System.out.println(category dao save);public void categoryInit()System.out.println(category 初始化);public void categoryDestroy()System.out.println(category 销毁);l 通过配置 确定初始化和销毁7.5.2 后处理beanl 必须实现接口:BeanPostProcessorObject postProcessBeforeInitialization(Object bean, String beanName) 初始化方法之前Object postProcessAfterInitialization(Object bean, String beanName) 初始化方法之后以上两个都需要返回值,默认情况下将第一个参数bean进行返回,如果返回是bean表示没有对目标对象进行增强。l 使用后处理bean,可以对目标对象进行增强,aop底层需要使用。只需要将后处理bean实现类配置给spring即可,默认情况spring将对容器中所有的bean进行增强。 不需要id或name属性l 后处理bean实现/* * 后处理bean的实现类 * author 传智左慈 * */public class MyBeanPostProcessor implements BeanPostProcessor /* * 返回bean代理对象,就可以对bean进行增强 * 使用动态代理 生成 CategoryDao接口的代理类 * * Proxy.newProxyInstance 生成代理对象 * 参数1:loader,把代理类加载到内存的 类加载器 * 参数2:interfaces ,代理类需要实现接口们 * 参数3:h InvocationHandler ,代理类方法请求处理类, * invoke() 代理类每一个方法执行时,都将执行invoke方法 * 参数3.1,Object proxy,代理对象本身 * 参数3.2,Method method,当前执行的方法 * 参数3.3,Object args,当前执行方法实际参数 */Overridepublic Object postProcessBeforeInitialization(final Object bean, String beanName)throws BeansException /System.out.println(before : + bean);return Proxy.newProxyInstance(MyBeanPostProcessor.class.getClassLoader(),bean.getClass().getInterfaces(), new InvocationHandler() Overridepublic Object invoke(Object proxy, Method method, Object args)throws Throwable System.out.println(方法前执行);/ 执行目标对象的方法Object obj = method.invoke(bean, args);System.out.println(方法后执行);return obj;);Overridepublic Object postProcessAfterInitialization(Object bean, String beanName)throws BeansException /System.out.println(after + bean);return bean;注意:需要将初始化和销毁方法取消,否则需要处理。7.6 依赖注入l 注入方式:手动注入、自动注入l 手动注入:xml注入:setter方法注入、构造方法注入、接口注入(spring不支持)注解注入l 自动注入:byType 按照类型、byName 按照名称、constructor构造方法、auto自动7.6.1 setter方法注入l 目标类:必须提供setter方法接收数据。例如:public void setUserDao(UserDao userDao)l 配置文件:通过ref : 表示引用。例如:自定义对象value:设置内容。例如:字符串7.6.2 构造方法!- 用于配置构造方法的某一个参数,多个配置构成参数列表. index 确定列表中参数位置,索引号,从0开始。如果多个构造方法都符号要求,选择最后一个。type 确定参数类型。通常使用index和type确定那个构造方法-l bean实现类public Topic(Integer tid, String content) super();this.tid = tid;this.content = content;public Topic(String content, Integer num) super();this.content = content;this.num = num;7.6.3 p命名空间l spring 2.5 提供对setter方法注入简化操作,称为p命名空间。l schema约束中添加p命名空间l 配置可以通过 p:属性名=设置value值 p:属性名-ref=设置ref值l 完全等效 setter配置!- 创建Customer -!- 创建Order -7.6.4 SpELl Spring3.0引入全新的SpEL(Spring Expression Language)Spring表达式语言,使用表达式语言可以使属性注入格式进行进一步简化,同时支持包括对象注入、集合注入、集合访问、实例方法引用、静态方法引用等多种格式l 参考文档l 之前如果注入的普通数据使用value,如果注入的是对象使用ref。SpEL使所有的注入过程都使用value进行l 格式:l 语法:整形:#123字符串:#abc,需要使用单引号引用bean:# userDaoId ,注意:没有单引号bean属性:# user.usernamebean方法:# user.username.toUpperCase()如果调用方法时返回null,将通过 ?. 方法进行过滤。例如:uesrname?.toUpperCase(), username不为null,将执行toUpperCase()方法静态方法|字段:# T(类).方法|字段 , # T(java.lang.Math).PI 正则表达式:# matches a-z6,7.6.5 集合注入l 集合一般多用于spring配置文件,给spring配置数据!- :如果普通数据 :如果是对象引用 配置数组 配置List集合 配置set集合 配置map集合,子标签 配置一个键值对 配置Properties对象,子标签value 配置key=value (且都是字符串) -jackrosetom关系薄纸停封磊磊佳佳萱萱老二牛Xv001v002v0038 装配bean基于注解l 注解:就是一个类,用于取代xml配置文件,使整个配置信息更简化。l 对比:如果使用xml配置,容易查看位置,但内容过多,不易于维护。如果使用注解配置,将注解添加类或接口上,易于编写,不容易查找位置。l 注解Component 组件,用于取代配置,建议配置任意内容。Controller ,用于配置web层,之后使用在action上。Service,用于配置service层。Repository ,用于配置dao层。AutoWired 自动注入,默认情况安装类型进行注入Qualifier 修改自动注入,从默认按照类型匹配,变成按照名称匹配。Resource 与 AutoWired和Qualifier结合 等效例如:Resource(名称)l spring如果需要使用注解,必须在xml文件配置进行被注解修饰类进行扫描。使用的context命名空间。8.1 web使用l xml配置描述包下面所有l action中配置 Controller,并使用AutoWired进行自动注入Controller(personActionId)public class PersonAction Autowiredprivate PersonService personService;public void add() System.out.println(action add);this.personService.addPerson();l service中配置Service,且使用AutoWired和Qualifier 确定使用指定的daoService(personServiceId)public class PersonServiceImpl implements Pers

温馨提示

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

评论

0/150

提交评论