- 浏览: 355851 次
- 性别:
- 来自: 沈阳
最新评论
-
sanrenxing_1:
GoEasy 实时推送支持IE6-IE11及大多数主流浏览器的 ...
极光推送(JPUSH)--- 消息推送 -
QuarterLifeForJava:
如果带有中文路径的话要写为:
URLDecoder.decod ...
获取类根路径及jar包路径 -
whyxy007:
请问楼主放上去的这张图就是最后需要安装的所有的包吗?还是说需要 ...
cordova 开发环境搭建
文章列表
Ognl 中PropertyAccessor 用于从类实例中获取或设置属性值
Ognl中已有的PropertyAccessor :因为不同的类的获取属性值和赋值方式不同,如Map、List、javabean,因此有多个子类,第一个子类对应一种类型。
Struts 对PropertyAccessor 的扩展:
Struts 加载扩展的PropertyAccessor :
Struts 中在OgnlValueStackFactory中调用OgnlRuntime.setPropertyAccessor(Class class,PropertyAc ...
Container 是struts 中的 bean的容器,用于创建bean并将依赖关系注入。
Container的默认实现类是ContainerImpl类, ContainerImpl内部持有一堆InternalFactory工厂,负责创建各种类,那么就需要有 被创建类与工厂的对应关系,才能定位到工厂。
实现类的表示方式:类型+实现类的名称,
ContainerImpl 内部执有 ”类型+实现类的名称“与工厂的对应关系,那么就可创建指定的类了。
类创建后,它的依赖对象如何注入?通实依赖类型+实现类名称可以定位到依赖类的工厂,依赖类的工厂可以创建依赖类的实例,通过反射就可 ...
Ognl的扩展点:
http://java12345678.iteye.com/blog/2031790
OGNL TypeConverter接口 :
类型转换,setValue时将值转换为实际的类型,或getValue时将获取的对象转换为需要的类型
Struts对TypeConverter的扩展:
OgnlValueStack中生成的上下文中使用了XworkConverter 做为类型转换类:
protected void setRoot(XWorkConverter xworkConverter, CompoundRootAccessor accesso ...
Ognl的扩展点:
http://java12345678.iteye.com/blog/2031790
OGNL ClassResolver接口 :
用于由类名到类路径中找到Class文件,并加载生成Class对象,以支持静态属性或方法的调用
Struts对ClassResolver 的扩展:
Struts中ClassResolver的加载:
OgnlValueStack类(Struts对Ognl的封装类):
protected void setRoot(XWorkConverter xworkConverter, CompoundRoo ...
Ognl的扩展点:
http://java12345678.iteye.com/blog/2031790
MemberAccess接口
定义了对于Memeber(Constructor,Method,Filed是否可以访问),Ognl默认实现DefaultMemberAccess对非公有Member不可以访问。
Struts2对DefaultMemberAccess进行了扩展:在DefaultMemberAccess的非公有Member不可以访问的基础上,添加哪些公有Member可以访问或不可被访问
一、参数决定哪些Memeber可以访问
1.静态方法 ...
Ognl的扩展点:
http://java12345678.iteye.com/blog/2031790
类OgnlValueStack 是struts2对Ognl的封装,提供了表达式取值或赋值方法,并不像ognl那样需要在方法参数中传递context,root 对象,因为context 、root对象已封状在OgnlValueStack 内部
Struts 对Ognl的封装,提供了setValue、set、setParameter等方法通过表达式赋值,findValue,findString 等方法取值。
构建器调用setRoot方法构建OgnlValueS ...
root 对象
CompoundRoot, CompoundRoot扩展了ArrayList,具有容纳对象及后进先出类似“栈”的能力。
public class CompoundRoot extends ArrayList {
public CompoundRoot() {
}
public CompoundRoot(List list) {
super(list);
}
public CompoundRoot cutStack(int index) {
...
OGNL提供的扩展方式,见官网:http://commons.apache.org/proper/commons-ognl/developer-guide.html
一、PropertyAccessor:提供了对属性赋值和提取属性值的方法。
因为不同的类的获取属性值和赋值方式不同,如Map、List、javabean,因此有多个子类,第一个子类对应一种类型。
PropertyAccessor 类何时加载的:
OgnlRunTime类中静态代码块,在类加载时调用:
static {
...
OGNL 可以通过表达式从java对象中获取值或向java对象赋值。
Ognl.java 源码:
参数说明:
expression :Strig对象,
表达式 指明对root或context中的哪个属性或方法操作 (set or get or call)
Object root :任意一个java对象
从中取值或赋值,不以#开头的表达式,是对root取值或赋值
context :一个Map对象,
1.可以从中取值 以#开头的表达式是从context取值
...
解耦设计--职责的细化
- 博客分类:
- OOD
一个工厂用于创建对象,如果对象在指定范围内存在(singleton,thread,request,session),则不创建新对象,而是使用之前创建的对象。
UML类图如下:
每个实现类中都有一样创建对象的过程,因此将生成对象方法抽成父类:
父类ObjectFactoryImpl实现了对象创建的过程,在创建对象之前(create方法中)首先调用抽像方法getObjectFromCache()来判断是否已存在该对象,如果已存在就直接返回,不存在就创建对象并调用putObjectToCache 方法存入缓存,已使下次使用时能直接获取。
从上图看出,每一个实现类都负责了二 ...
锁用于解决多线程对共享资源的同时访问,而引起的非线程安全问题:某一时该只有一条线程可以访问共享资源,达到了线程安全的目的,但同时也限制了并发处理的速度。
锁的分类:
同步锁: synchronized 是java 内置的语法
可重入锁:ReentrantLock 是一个java类
读写锁:ReentrantReadWriteLock 是一个java类
锁定的范围:
由于锁使线程互斥访问,未获得锁的线程会阻塞,限制了并发处理的速度,因此线程应该锁定尽量小的范围及尽快的释放锁。
比如一家企业,有10个厕所,每个厕所有5个坑,每个员工都要上厕所,厕所的同 ...
某个功能或算法有多种实现方式,可以使用策略模式:
枚举类也可以实现策略模式类似的功能:(前提:实现个数固定)
枚举类声明一个抽像的方法,由各个实例去实现。
枚举实例的选择:
1.直接引用Scope.实例名
2.由字符串生成 Scope.valueOf("实例名");
示例:(参考了Struts 2.3.26 的Scope源码)
public enum ScopeFactory {
SINGLETON{
public Object create(Class classz){
return null; ...
单例与多例、无状态与有状态
- 博客分类:
- OOD
单例:某个类系统范围内只有一个实例
多例:某个类在系统范围内同时有多个实例
无状态类:类中没有状态信息,一般是无成员变量或成员变量的值是不变的。
有状态类:类中有状态信息,一般表现成员变量的值可变,在某一时该被调用而改变状态,之后再调用时获取其正确的状态。
有状态类的实例 ,一般是多例的,用于保存多个相同类型的不同状态值。因为只有一个实例,单线程重复调用情况下可能覆盖实例中之前的成员变量值、多线程下一次调用也可能覆盖实例中之前的成员变量值,造成状态丢失,就需要多个实例来保存不同的状态。
无状态类的实例,一般是单例的,因为没有状态,所以单线程下重复调用或多线程下调用对实例没有影响 ...
每一个类都应该有自己的职责,职责应该是单一类型的,就是我只做这一类的事情,其它的事件不需要我来管,而”这一类事情“有紧密的相关性,也就是高内聚。
类中每个方法都应该功能单一、代码简洁,如果有多个地方使用的相同的代码块,应该将该代码块抽成独立的private的方法。
封状的意义在于降底耦合度,只对外提供能够完成职责的方法,而封闭内部实现细节和数据等。
类中除了职责方法外,一般还包含:
1.属性 对外应该是private ,如果外部确实需要访问,可以提供get/set方法
2.某些方法,是为了支撑职责的实现而存在,如果这些方法对外部没 ...
需要一个类提供某些功能,这些功能可能有不同的实现方式,可以把它设计为接口。
1.首先明确接口职责范围,职责需要高内聚的,即相关性的职责,无关的职责不应该加进来。
2.按照分析好的职责范围定义接口
...