69

これは以前に尋ねられた質問のように見えるかもしれませんが、ここで別の問題に直面しています。

静的メソッドのみを持つユーティリティクラスがあります。私はそうしませんし、そこからインスタンスを取得しません。

public class Utils{
    private static Properties dataBaseAttr;
    public static void methodA(){

    }

    public static void methodB(){

    }
}

ここで、データベース属性Properties.Spring構成でdataBaseAttrを埋めるためにSpringが必要です。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">

<util:properties id="dataBaseAttr"
        location="file:#{classPathVariable.path}/dataBaseAttr.properties" />
</beans>

私はすでに他のBeanでそれを行いましたが、このクラス(Utils)の問題はBeanではありません。また、Beanを作成しても何も変更されないため、クラスはインスタンス化されず、常に変数であるため、変数を使用できません。 nullに等しい。

4

3 に答える 3

111

2つの可能性があります。

  1. 静的プロパティ/フィールドの非静的セッター。
  2. org.springframework.beans.factory.config.MethodInvokingFactoryBean静的セッターを呼び出すために使用します。

最初のオプションでは、通常のセッターを備えたBeanがありますが、代わりにインスタンスプロパティを設定して、静的プロパティ/フィールドを設定します。

public void setTheProperty(Object value) {
    foo.bar.Class.STATIC_VALUE = value;
}

ただし、これを行うには、このセッターを公開するBeanのインスタンスが必要です(回避策のようなものです)。

2番目のケースでは、次のように実行されます。

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="staticMethod" value="foo.bar.Class.setTheProperty"/>
    <property name="arguments">
        <list>
            <ref bean="theProperty"/>
        </list>
   </property>
</bean>

あなたの場合、Utilsクラスに新しいセッターを追加します。

public static setDataBaseAttr(Properties p)

そして、あなたのコンテキストでは、多かれ少なかれ次のように、上記で例示したアプローチで構成します。

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="staticMethod" value="foo.bar.Utils.setDataBaseAttr"/>
    <property name="arguments">
        <list>
            <ref bean="dataBaseAttr"/>
        </list>
   </property>
</bean>
于 2012-07-04T07:36:43.957 に答える
22

同様の要件がありました。Springが管理するリポジトリBeanをPersonエンティティクラス(「IDを持つもの」のような「エンティティ」、たとえばJPAエンティティ)に注入する必要がありました。Personインスタンスにはフレンドがあり、このインスタンスPersonがそのフレンドを返すために、インスタンスはリポジトリに委任し、そこでフレンドを照会する必要があります。

@Entity
public class Person {
    private static PersonRepository personRepository;

    @Id
    @GeneratedValue
    private long id;

    public static void setPersonRepository(PersonRepository personRepository){
        this.personRepository = personRepository;
    }

    public Set<Person> getFriends(){
        return personRepository.getFriends(id);
    }

    ...
}

@Repository
public class PersonRepository {

    public Person get Person(long id) {
        // do database-related stuff
    }

    public Set<Person> getFriends(long id) {
        // do database-related stuff
    }

    ...
}

では、どのようにしてそのPersonRepositoryシングルトンをPersonクラスの静的フィールドに注入したのでしょうか。

を作成しました。これは、 SpringApplicationContextの構築時@Configurationに取得されます。これには、静的フィールドとして他のクラスに注入する必要のあるすべてのBeanが注入されます。次に、注釈を付けて、すべての静的フィールドインジェクションロジックを実行するためのフックをキャッチします。@Configuration@PostConstruct

@Configuration
public class StaticFieldInjectionConfiguration {

    @Inject
    private PersonRepository personRepository;

    @PostConstruct
    private void init() {
        Person.setPersonRepository(personRepository);
    }
}
于 2013-02-05T13:24:12.870 に答える
2

これらの答えは古いので、私はこの代替案を見つけました。これは非常にクリーンで、Javaアノテーションのみで機能します。

これを修正するには、「none static setter」を作成して、静的変数に挿入された値を割り当てます。例えば ​​:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class GlobalValue {

public static String DATABASE;

@Value("${mongodb.db}")
public void setDatabase(String db) {
    DATABASE = db;
}
}

https://www.mkyong.com/spring/spring-inject-a-value-into-static-variables/

于 2019-09-26T05:17:43.253 に答える