如何让春季将价值注入静态领域

我知道这可能看起来像以前提出的问题,但我在这里面临一个不同的问题。

我有一个只有静态方法的工具类。 我不这样做,我不会从中得到一个例子。

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

现在我需要Spring来填充dataBaseAttr与数据库属性Properties.Springconfiguration是:

 <?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没有改变,我仍然不能使用这个variables,因为这个类不会被实例化并且总是variables等于null。

你有两种可能性:

  1. 用于静态属性/字段的非静态setter;
  2. 使用org.springframework.beans.factory.config.MethodInvokingFactoryBean来调用静态setter。

在第一个选项中,你有一个常规setter的bean,而是设置一个实例属性来设置静态属性/字段。

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

但为了做到这一点,你需要有一个bean的实例,将公开这个setter(它更像是一个解决方法 )。

在第二种情况下,将如下进行:

 <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类中添加一个新的setter:

 public static setDataBaseAttr(Properties p) 

在你的上下文中,你将用上面例举的方法进行configuration,或多或less的像:

 <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> 

我有一个类似的需求:我需要注入一个Springpipe理的存储库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类的静态字段?

我创build了一个@Configuration ,它在Spring ApplicationContext构造时被获取。 这@Configuration获取注入所有那些我需要注入静态字段到其他类的bean。 然后用@PostConstruct注解,我抓住一个钩子做所有静态字段注入逻辑。

 @Configuration public class StaticFieldInjectionConfiguration { @Inject private PersonRepository personRepository; @PostConstruct private void init() { Person.setPersonRepository(personRepository); } }