您的当前位置:首页spring学习笔记2

spring学习笔记2

2024-02-20 来源:爱问旅游网
Spring学习笔记

关键字: spring

BeanFactory和Application BeanFactory的分类

org.springframework.io.ByteArray 定义内容由一组字节给点的资源 org.springframework.core.io.ClassPath 定义可从classpath提取的资源 org.springframework.core.io.Descriptive 定义包含资源描述符但是实际没有可读资源的资源(不懂)

org.springframework.core.io.FileSystemResource 定义可从文件系统提取的资源 org.springframework.core.io.InputStreamResource 定义从输入流提取的资源

org.springframework.web.portlet.context.PorletContextResource 定义可用在portlet上下文中的资源

org.springframework.web.context.support.ServletContextResource 定义可用在servlet上下文中的资源

org.springframework.core.ioUrlResource 定义可以用在URL提取的资源

ApplicationContext

ClassPathXmlApplicationContext 从类路径中的xml文件载入上下文定义的信息 FileSystemXmlApplicationContext 从文件系统中的XML文件载入上下文定义的信息 XmlWebApplicationContext 从Web系统中的Xml文件载入的定义信息

ApplicationContext和BeanFactory的作用几乎相同。只是前者比后者多了3个功能

1,提供了文本信息解析工具,包括国家化(I18N)的支持 2,提供了载入文件资源的通用方法,如载入图片 3,可以像想注册为见提起的Bean发送事件

由于刚学,所以觉得还没发觉前面两个有什么特别的用处。但是最后一个真是相当不错的方法。在书中说,只有在资源很少的情况下,例如移动设备上才考虑用BeanFactory,由此可见ApplicationContext资源不比Beanfactory多多少。所以估计才企业开发中,可以完全不用考虑。

Bean的生命周期 1) 实例化 2) 设置属性值

3)调用BeanNameAware的setBeanName()方法 4)抵用BeanFactoryAware的setBeanFactory()方法

5)调用ApplicationContextAware的setApplicationContext方法 6)抵用BeanPostProcessor的预初始化方法

7)调用InitializingBean的afterPropertiesSet方法 8)调用定制的初始化方法

9)调用BeanPostProcessor的后初始化方法 ----Bean可以被使用了

10)调用DisposableBean的destroy犯法 11)抵用定制的销毁方法。

以上是一个ApplicationContext中的bean的生命周期,BeanFactory只比其少了红色的这个方法。 书中没有对各个方法有什么特别的阐述,但是就其方法名来猜测,我觉得是为了让Spring管理Bean(是指实例化Bean之后)而做的一些工作。

装配Bean

Xml代码

 class=\"geniusgame.PoeticJuggler\">   

  class=\"geniusgame.Sonnet29\">     class=\"geniusgame.Instrumentalist\"  init-method=\"begin\"  destroy-method=\"a\">

   

  class=\"geniusgame.OneManBand\">    

  

 

关于注入方式的选择书中也说了各有千秋,但就我个人而言,我比较喜欢属性注入的方式,首先,这样更像一个bean,其次,使产生的Bean不那么依赖于Spring,或者说先期的配置。

Bean的范围

在Bean标签中使用scope属性,对应的值分别为

singleton 定义bean的范围为每一个Spring容器一个实例

Prototype 允许Bean可以被多次实例化(使用一次就创建一个实例) request 定义Bean的范围为Http的请求(web中有效) session 定义Bean的范围为Http的会话(web中有效)

global-session 定义Bean的范围是全局Http会话,只有在portlet上下文中才有效。

利用工厂化方法来创建Bean

配置文件是这样的。我对其的理解是,一旦使用了这种方法,那么也就是告诉了Spring,生成这个方法的时候,调用Class类factory-method中指定的方法,书中的例子利用这个在不同的context中生成

相同的Bean

初始化和销毁Bean

两种方式,一种是使用标签中的init-method方法和destory-method方法。另一种让类实现InitializingBean和DisposableBean接口

其实个人觉得,这些方法有点怪,难道不能直接把初始化的方法写在构造函数中,然后把destroy方法写入finialize方法,不过转念一想,估计是和上下文有关吧。就好像Hibernate中的,持久化对象交由持久化上下文管理一样。这里bean也会被ApplicationContext管理沾点边吧?

Spring学习笔记(二)

文章分类:Java编程 关键字: spring 声明父bean和子bean

这个概念是从java中来的,但是却和java中的有着本质的不同。

就好像书上说的一样,学习spring的都是对java有些了解的都对父类和子类有着了解。所以这里也没有必要继续从头开始讲。介绍这部本可以从其与java的不同开始。

类,无论哪种语言,都可以是看成一个方法和成员变量的共生体。方法决定其行为,而成员变量决定是它的状态,所以在java或者类似的oo语言中,继承往往是比较保守的。既只有相同或者有关系的类才能继承。

在Spring中,其注入的,或者说能够控制的只有成员变量这一块。不用考虑方法,所以在spring中的“继承”就没有那么严格,至少我觉得,与其叫做继承,叫做存放公共变量比较合适。 具体的操作就是parent。不过要注入的属性名称需要注意。 方法注入

方法注入有两种,

一种是方法替换。用的是。然后创建一个类,实现MethodReplacer方法来实现。 另一种方法,可以当做是只是注入其返回值。要把类和你想要注入的方法设定为abstract。然后用方法决定注入的是哪一个值。

我觉得这种方法注入有点怪,只适合于一些特定的场合,比方说要访问另一个包里面非public的东西的时候可以使用。但是其他场合我总觉得这种方式不妥。随意这种方法注入我觉得很容易造成代码的混乱。举个书中的例子来说,书中借用了ruby的例子来说明方法的这种注入式多么方便。我觉得这种方法的注入,如果在跨模块之间的发生就会捣乱模块与模块之间的沟通。之所以把代码分为模块,同时控制模块与模块之间的通信,其目的就是为了防止模块相互之间,触碰对方的底层数据,形成耦合。 当然这一章开头所说的,这一章的内容就好像有一个家里的工具箱,有问题的时候才会用。

注册自定义属性编辑器

简单的说,就是你把一些值类型自动转换成对象。具体操作没什么好多说的,直接看代码吧。

Xml代码

        

class=\"org.springframework.beans.factory.config.CustomEditorConfigurer\">

  class=\"propeditor.PhoneEditor\"/>     Bean的后处理

让一个类实现BeanPostProccessor方法,然后把其配置到文件中,不加入id,只有class属性

发布和监听事件

发布方继承ApplicationEvent,接受方实现ApplicationListener方法,然后发布事件是ApplicationContext实例的publicevent

了解Bean内容

了解名称,实现BeanNameAware接口,了解容器,实现ApplicationContextAware Spring学习笔记(三)

文章分类:Java编程 关键字: spring AOP基本术语

通知(advice):定义是切面的目标,功能。但是就我的感觉来说,这只是一个类似桥梁的中间件。因为在例子中的所有advice类,就指明了什么时候该做什么方法。不过就advice的字义来理解。它只是一个建议,建议什么时候执行吧。

连接点(joinpoint):书上的定义是应用通知的时机,书上的这个定义有点模糊。我是这么理解的,如果说一个系统中,应用切面编程的所有交点。在我脑海中,有这样一幅图片(是受了书上的突变的启发):

其实编写一个软件,会有很多的逻辑流,他们相互的交织着一个软件才能完成一个工作。而连接点就是这些逻辑流的交点。

切入点(pointcut):一个连接点的子集,或者说集合。借用一个数据库的概念,就是形成一个“原子性”的接入点。这里就是形成了一条逻辑流上所有的点。 切面(Aspect):通知和切入点的集合

引入(Introduction):允许向现有的类添加新方法和属性。这个我总觉得和切面不搭界。 目标(Target):被通知的对象,也就是被切的对象

代理(Proxy):这估计和Spring实现AOP的方式有关。Spring是利用代理来完成的。这就是为了实现而形成的代理。

织入(Weaving):实现AOP的过程。 流程

整个的流程相当的简单,建议一个切面。这里的切面其实就是一个逻辑流。切面只是在业务中不是占主导地位,或者说不是主要功能,但是必须要存在的逻辑流。就好像书中的例子观众,我们都明白这些其实对于程序来说,并不是最重要的。没有观众也能演,没用身份验证程序同样能跑。但是没有了会变成另一样东西,没有观众的表演叫彩排。

然后是建立通知。其实就是建立其和其他逻辑流交叉的时候的连接点进行定义。我觉得这有点拗口。毕竟程序是死的,但是逻辑是活的。逻辑流的之间需要排好方法执行的先后,这就是通知的作用。 切入点。这个有点死。就是配置xml文档。 Xml代码

class=\"org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor\" >

其中,advice表示是刚才建立的通知者的类。而erpression可以说是真正的切入点。既执行的方法。 这里还有一个语法。第一个*代表的是返回值,然后空格,第二个星表示的是类名。dot然后就是方法名。这里为了方便,就大多数都用了*,表示代表全部。如果实际中,则是正常的名字。

最后设置代理。其实这一段我明白,但是难以用言语表示其作用。在spring中,任何东西都需要一个bean。代理也是毅然。下面是xml文档。 Xml代码

 class=\"geniusgame.PoeticJuggler\">  

 

  class=\"org.springframework.aop.framework.ProxyFactoryBean\"> 

  

然后是自动代理,少了一个bean的设置。 Xml代码



纯粹的aop切面

理解了上面,这个只是一个形式而已。我就直接写xml配置文件了。 Xml代码

 

   method=\"takeSeats\"

 pointcut=\"execution(* *.perform(..))\"  />    method=\"turnoffCellPhones\"

 pointcut=\"execution(* *.perform(..))\"  /> 

  pointcut=\"execution(* *.perform(..))\"

 />

  pointcut=\"execution(* *.perform(..))\"  />   

因篇幅问题不能全部显示,请点此查看更多更全内容