overload 重载

通过overload,我们可以在同一个类中重用同一个方法,只是这些方法的参数必须不同,而返回类型可以不同。

关于overload的限定:
1. 重载的方法的参数必须不同;
2. 重载的方法的返回值类型可以不同;
3. 重载的方法的访问修饰符可以不同;public,private,protected…
4. 重载的方法可以声明不同的Exception或扩大checked exception的范围;
5. 重载可以发生在同一个类或者子类中。
例如,父类定义了 doIt(int i), 子类可以定义doIt(String sth) 来重载之。

发表在 未分类 | 标签为 | 留下评论

无效的重写(override)类型

Override 重写,即子类重新声明了父类中的某个方法,以提供特定于自身的实现。

例如:

public class Animal{

public void eat(){
System.out.println(“Generic Eat Method”);
}

子类的override以下几种是无效的:

1. private void eat() 降低了eat方法的访问权限
2. public void eat() throws IOException 声明的异常超出了被重写的方法的异常声明
3. public void eat(String food) 重写的方法的参数与被重写的不一致
4. public String eat() 方法返回类型与被重写的方法不一致;

发表在 未分类 | 标签为 | 留下评论

为何@PostConstruct没有执行?

在代码中通过@PostConstruct指定bean的初始化调用方法,但是运行后发现该方法并没有被调用。

解决方法:在xml配置文件中加入一条指示符,让Spring处理相应的Annotation。

<beans xmlns=”http://www.springframework.org/schema/beans
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance
xmlns:context=”http://www.springframework.org/schema/context

xsi:schemaLocation=”http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd“>

<context:annotation-config />


粗体部分是需要加入的与context相关的命名空间。

发表在 未分类 | 标签为 | 留下评论

Spring Note (2) – Bean Lifecycle

Bean初始化之callback

我们可以通过两种方式实现之:
1。实现InitializingBean接口及对应的方法。
void afterPropertiesSet() throws Exception

缺点:代码与Spring产生耦合

2。xml配置中通过init-method
<bean id=“beanID” class=“bean_Class” init-method=“init_method_name”/>
我们可以在init_method_name对应的方法中实现bean的初始化操作。
优点:通过bean自身实现初始callback操作,与Spring解耦。

Bean销毁之callback

同样,我们可以通过类似的两种方式来实现bean销毁时的操作定义
1。实现DisposableBean 接口
void destroy() throws Exception;

2。xml配置文件中指定destroy-method
<bean id=”beanId” class=”bean_class” destroy-method=”cleanup” />
在该bean类中通过cleanup方法实现bean回收操作, 例如连接释放等。

发表在 未分类 | 标签为 | 留下评论

Spring notes (1)

Spring Bean Scope

1. Singleton(default)
Spring容器创建一个该bean的实例,并放置在cache中。后续的请求将从该cache中取得bean的单一实例。

2. Prototype
每次请求都获得一个新的bean实例。

3. Request
只在实现 web-aware 的ApplicationContext 有用。例如 XmlWebApplicationContext
例如在Spring+Struts中,action bean对应的scope可以设置为 scope=”request”

4. Session
包含用户信息的bean的scope可以设置为 scope=”session”

5. Global Session
只针对portlet类型的web应用。

当我们需要在singleton scope的bean中引用 request/session之类的bean时,我们需要在scope=request/session的bean的定义中加入<aop:scoped-proxy/>,通过AOP为bean创建一个实现该bean所有接口的proxy,所有对该bean的调用都通过proxy实现。
原因:因为singleton类型的bean只被当前spring容器初始化一次,而当其被初始化时,request/session类型的bean还没有被创建。所有只有通过创建其proxy,让singleton类型的bean引用该proxy,proxy bean再从request或session中获取相应的bean,并将调用映射到其上.

<aop:scoped-proxy/> 需要CGLIB的支持,并且CGLIB只代理目标bean的公有方法。

如果我们只想依赖于JDK的基于接口的proxy实现,我们需要修改AOP的声明:
<aop:scoped-proxy proxy-target-class=”false”/>
注:被proxy的bean类至少有实现一个接口类。

发表在 未分类 | 标签为 | 留下评论

Java5 通过反射获得T.class的类型

例子来自Hibernate Wiki.
public abstract class GenericHibernateDAO<T, ID extends Serializable> implements GenericDAO<T, ID> { 
    private Class<T> persistentClass;
    public GenericHibernateDAO() {
        this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
                                .getGenericSuperclass()).getActualTypeArguments()[0];
     }

如果我们使用ItemDAO extends GenericHibernateDAO<Item,id>
那程序中persistentClass对应的就是Item类。

这也是曾经困扰了我的一个问题。

发表在 Languages | 留下评论

Web 应用中初始化Spring的ApplicationContext

我们可以通过在web.xml中配置一个Listener的方式来初始化ApplicationContext

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/daoContext.xml /WEB-INF/applicationContext.xml</param-value>

</context-param>

 

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

 

当web容器初始化的时候,会初始化我们设置的

发表在 未分类 | 留下评论

Hello world!

Welcome to WordPress.com. This is your first post. Edit or delete it and start blogging!

发表在 未分类 | 一条评论

Struts2: StrutsPrepareAndExecuteFilter

  该filter的作用:
   1. 执行action
   2. 清理ActionContext
   3. 提供静态文件的访问

   1. 执行action
       通过请求ActionMapper来获知相应的URL对应的action类。如果找到了,则停止filter的调用链,并触发相应的action调用。

   2. 清理ActionContext
      它会帮我们自动清理每次请求过程中生成的AC的实例,确保没有内存泄露。

   3. 提供静态内容的访问
      它会查找以 /struts//static/开头的URL,并将其后的内容在默认的包中查找对应的资源文件,如,js、css、images等。默认的包是org.apache.struts2.static和template,不过我们可以通过filter的初始化参数 packages来设定我们自己的静态内容包名。

      Filter支持的初始化参数有:
  1. config   用逗号间隔的初始化配置文件,默认值 struts-default.xml,struts-plugin.xml,struts.xml
     2. actionPackages   逗号间隔的包含action类的包路径,用以系统初始化的时候进行自动扫描。
     3. configProviders  逗号间隔的用于创建Configuration的实现了ConfigurationProvide接口的实现类。
     4. loggerFactory    实现LoggerFactory的具体实现类
 

   首先加载 org/apache/struts2/default.properties的配置信息,在读取config指定的配置文件的信息,设定configProvider的信息(如果指定的话),关联类型的处理类(如,struts.objectTypeDeterminer对应ObjectTypeDeterminer.class),加载struts.custom.i18n.resources指定的全球化资源文件,注册DispatcherListener。

 随后初始化静态内容加载器,默认的路径是 org.apache.struts2.static template org.apache.struts2.interceptor.debugging static和初始化参数packages指定的路径,中间用空格间隔

   如果指定模式 devMode = true,则会自动重新加载 struts配置文件、I18N资源文件。

  doFilter操作中,执行顺序:
  1. prepare操作创建ActionContext,并置于ThreadLocal中
  2. 将当前Dispatcher置于ThreadLocal中
  3. 设置req的encoding和locale,如果指定的话
  4. 为了处理文件上传,将request进行封装为MultiPartRequestWrapper
  5. 查找对应的ActionMapping信息,如果找不到,则检查是否是静态内容;否则,调用相应的Action。
  6. 清理ThreadLocal的ActionContext和Dispatcher

发表在 未分类 | 留下评论

数据库分隔

1. 水平切分 horizontal partitioning
  将不同的数据行放置于不同的表中。比如,对于zip编号小于50000的地址行,存放于表CustomerEast中;而zip编号>=50000的地址则保存于表CustomerWest中。
  同时,会创建一个视图来union这两张表的数据,让用户感觉就是从一处查询到了所有的地址信息。

2. 垂直切分 vertical partitioning
  对一张表中的列进行拆分,将其分为动态数据和静态数据。静态数据即不需要经常修改的;动态则反之。同时,创建一个视图来union这两部分的数据来展示全部的信息;该方式能极大提高对静态数据的访问速度,但对原始数据的访问则效率降低。

拆分原则:
   先确定一个拆分关键字 partitioning key,然后按照以下规则进行拆分:
   1. 按范围拆分
       按照key所在的区域范围,将数据拆分到多张表中。比如上例的zip code;
   2. 按集合拆分
       当拆分key包含某个集合中的值时,可以按照该集合进行拆分。比如,数据集的country为China、Japan、Korea等,可以将其拆分到表Asia中。
   3. 哈希拆分
       按照一定的散列算法将值散列到多张表中。

Shard
  Database sharding:数据库中的水平分片。每个分片即为一个shard。

发表在 Knowledge | 留下评论