spring工厂方式创建bean

最近在读webservice源代码的时候有看到了工厂方式实例化bean的方式,索性就记下来

 

如果有这样的需求

  1 不想再bean.xml加载的时候实例化bean,而是想把加载bean.xml与实例化对象分离。

  2 实现单例的bean

以上的情况,都可以通过工厂方法factory-method来创建bean

这样再加载bean.xml时,不会直接实例化bean,而是当调用factory-method所指的方法时,才开始真正的实例化。

 

  首先看一下传统的单例模式的实现方式:

  1 最原始的实现单例模式的方法(存在线程不安全):

复制代码
public class SingletonOne {
    private static SingletonOne instance = null;
    private SingletonOne() {}
    public static SingletonOne getInstance() {
        if (instance == null) {
            instance = new SingletonOne(); 
        }
        return instance;
    }
}    
复制代码

  但是这种方法有一个弊端,就是存在线程的不安全!

  比如当两个线程同时进入if(instance == null)时,一个线程判断了当前为空,然后切换到另一个线程,这个线程也判断为空。然后切换回第一个线程,进行实例化,再切换到第二个线程,进行实例化。这样就存在了两个实例。

  2 通过关键字Synchronized强制线程同步 

复制代码
package com.something.singleton;
public class SingletonTwo {
    private static SingletonTwo instance = null;
    private SingletonTwo() {}
    public static synchronized SingletonTwo getInstance() {
        if (instance == null) {
            instance = new SingletonTwo();
        }
        return instance;
    }
}
复制代码

  这样当线程进行到getInstance会同步的进行,不会有线程安全问题,但是不仅仅是实例化,每次调用也需要同步,这样就会造成很多资源的浪费。

 其实我看到webservice源代码的时候他也是使用了synchronized关键字(synchronized关键字在这里在回顾一下:当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块)

下面让大家看看代码

1 <bean id="client" class="com.demo.HelloWorld"  factory-bean="clientFactory" factory-method="create"/>
3     
4  <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
5        <property name="serviceClass" value="com.demo.HelloWorld"/>
6        <property name="address" value="http://localhost:8080/s/webservice/helloWorld"/>
9  </bean>
JaxWsProxyFactoryBean里create方法的代码
 1 @Override
 2     public synchronized Object create() {
 3         ClassLoaderHolder orig = null;
 4         try {
 5             if (getBus() != null) {
 6                 ClassLoader loader = getBus().getExtension(ClassLoader.class);
 7                 if (loader != null) {
 8                     orig = ClassLoaderUtils.setThreadContextClassloader(loader);
 9                 }
10             }
11             
12             Object obj = super.create();
13             Service service = getServiceFactory().getService();
14             if (needWrapperClassInterceptor(service.getServiceInfos().get(0))) {
15                 List<Interceptor<? extends Message>> in = super.getInInterceptors();
16                 List<Interceptor<? extends Message>> out = super.getOutInterceptors();
17                 in.add(new WrapperClassInInterceptor());
18                 in.add(new HolderInInterceptor());
19                 out.add(new WrapperClassOutInterceptor());
20                 out.add(new HolderOutInterceptor());
21             }
22             return obj;
23         } finally {
24             if (orig != null) {
25                 orig.reset();
26             }
27         }
28     }
29     

 

下面给几个连接

 使用facotry-method创建单例Bean总结

以及spring-method


 

posted @ 2016-09-05 07:41 奋斗,坚持 阅读(...) 评论(...)  编辑 收藏