关键字: 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代码
关于注入方式的选择书中也说了各有千秋,但就我个人而言,我比较喜欢属性注入的方式,首先,这样更像一个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 两种方式,一种是使用 其实个人觉得,这些方法有点怪,难道不能直接把初始化的方法写在构造函数中,然后把destroy方法写入finialize方法,不过转念一想,估计是和上下文有关吧。就好像Hibernate中的,持久化对象交由持久化上下文管理一样。这里bean也会被ApplicationContext管理沾点边吧? Spring学习笔记(二) 文章分类:Java编程 关键字: spring 声明父bean和子bean 这个概念是从java中来的,但是却和java中的有着本质的不同。 就好像书上说的一样,学习spring的都是对java有些了解的都对父类和子类有着了解。所以这里也没有必要继续从头开始讲。介绍这部本可以从其与java的不同开始。 类,无论哪种语言,都可以是看成一个方法和成员变量的共生体。方法决定其行为,而成员变量决定是它的状态,所以在java或者类似的oo语言中,继承往往是比较保守的。既只有相同或者有关系的类才能继承。 在Spring中,其注入的,或者说能够控制的只有成员变量这一块。不用考虑方法,所以在spring中的“继承”就没有那么严格,至少我觉得,与其叫做继承,叫做存放公共变量比较合适。 具体的操作就是parent。不过要注入的属性名称需要注意。 方法注入 方法注入有两种, 一种是方法替换。用的是 我觉得这种方法注入有点怪,只适合于一些特定的场合,比方说要访问另一个包里面非public的东西的时候可以使用。但是其他场合我总觉得这种方式不妥。随意这种方法注入我觉得很容易造成代码的混乱。举个书中的例子来说,书中借用了ruby的例子来说明方法的这种注入式多么方便。我觉得这种方法的注入,如果在跨模块之间的发生就会捣乱模块与模块之间的沟通。之所以把代码分为模块,同时控制模块与模块之间的通信,其目的就是为了防止模块相互之间,触碰对方的底层数据,形成耦合。 当然这一章开头所说的,这一章的内容就好像有一个家里的工具箱,有问题的时候才会用。 注册自定义属性编辑器 简单的说,就是你把一些值类型自动转换成对象。具体操作没什么好多说的,直接看代码吧。 Xml代码 让一个类实现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代码 其中,advice表示是刚才建立的通知者的类。而erpression可以说是真正的切入点。既执行的方法。 这里还有一个语法。第一个*代表的是返回值,然后空格,第二个星表示的是类名。dot然后就是方法名。这里为了方便,就大多数都用了*,表示代表全部。如果实际中,则是正常的名字。 最后设置代理。其实这一段我明白,但是难以用言语表示其作用。在spring中,任何东西都需要一个bean。代理也是毅然。下面是xml文档。 Xml代码 然后是自动代理,少了一个bean的设置。 Xml代码 纯粹的aop切面 理解了上面,这个只是一个形式而已。我就直接写xml配置文件了。 Xml代码 pointcut=\"execution(* *.perform(..))\" /> pointcut=\"execution(* *.perform(..))\" /> /> 因篇幅问题不能全部显示,请点此查看更多更全内容