Spring中的静态setter方法注入

时间:2011-01-07 20:47:08

标签: java spring static

我有以下要求 我想通过spring配置文件将http:\\localhost:9080\testws.cls值作为setter注入传递。我如何为TEST1_WSDL_LOCATION

执行此静态变量setter注入
public class test1
    extends javax.xml.ws.Service
{

    private final static URL TEST1_WSDL_LOCATION;

    static {
        URL url = null;
        try {
            url = new URL("http:\\localhost:9080\testws.cls");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        TEST1_WSDL_LOCATION = url;
    }

    public test1(URL wsdlLocation, QName serviceName) {
        super(wsdlLocation, serviceName);
    }

    public test1() {
        super(TEST1_WSDL_LOCATION, new QName("http://tempuri.org", "test1"));
    }

    /**
     * 
     * @return
     *     returns test1Soap
     */
    @WebEndpoint(name = "test1Soap")
    public Code1Soap getTest1Soap() {
        return (Test1Soap)super.getPort(new QName("http://tempuri.org", "Test1Soap"), Test1Soap.class);
    }

}

请帮帮我。

4 个答案:

答案 0 :(得分:4)

Spring无法从外部初始化静态最终字段。

这是不可能的。静态最终字段在类加载时初始化,早在Spring有机会做任何事情之前(并且无论如何都不能将参数传递给ClassLoader)。

你必须重新考虑你的设计。这不行!

答案 1 :(得分:1)

你可以在bean实例上设置一个setter。

Class WsdlCode{   
private static URL WSDL_LOCATION;
    public void setUrlString(String url) {
        URL url = null;
        try {
            url = new URL(url);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        WSDL_LOCATION = url;
    }

当然,直到所有bean都设置了属性之后,该字段才可用,但Spring有一些接口。例如InitializingBean

答案 2 :(得分:1)

@Component
public class UserUtils
{
    private static UserAccessor userAccessor;

    /**
     * Sets the user DAO. This method should never be called except by Spring
     * @param userAccessor The user accessor to set
     */
    @Autowired(required = true)
    public void setUserAccessor(userAccessor UserAccessor) {
        UserUtils.userAccessor = userAccessor;
    }
}

资源:http://www.connorgarvey.com/blog/?p=105#codesyntax_1

答案 3 :(得分:0)

正如有人已经提到的那样,Spring不会这样做。在Spring可能影响该值之前,将运行静态初始化程序。

你可能应该做的是将Spring中的Code1类实例化为bean并在那里设置值。如果值需要由bean的多个实例共享,那么在Spring中将值设为单例作用域。