これは以前に尋ねられた質問のように見えるかもしれませんが、ここで別の問題に直面しています。
静的メソッドのみを持つユーティリティクラスがあります。私はそうしませんし、それからインスタンスを取りません。
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に等しい。
次の2つの可能性があります。
org.springframework.beans.factory.config.MethodInvokingFactoryBean
を使用して、静的セッターを呼び出します。最初のオプションでは、通常のセッターを持つBeanがありますが、代わりにインスタンスプロパティを設定し、静的プロパティ/フィールドを設定します。
public void setTheProperty(Object value) {
foo.bar.Class.STATIC_VALUE = value;
}
しかし、これを行うには、このセッターを公開するBeanのインスタンスが必要です(workaroundに似ています)。
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>
同様の要件がありました。Spring管理のリポジトリBeanをPerson
エンティティクラス(たとえば、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
クラスの静的フィールドに挿入したのでしょうか。
@Configuration
を作成しました。これはSpring ApplicationContextの構築時間に取得されます。この@Configuration
には、静的フィールドとして他のクラスに注入する必要があるすべてのBeanが注入されます。次に、@PostConstruct
アノテーションを使用して、すべての静的フィールドインジェクションロジックを実行するフックをキャッチします。
@Configuration
public class StaticFieldInjectionConfiguration {
@Inject
private PersonRepository personRepository;
@PostConstruct
private void init() {
Person.setPersonRepository(personRepository);
}
}