如果下面@Autowire的BlahServicewith SCOPE_PROTOTYPE,我得到的IllegalArgumentException原因name是null:
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
class BlahService {
private String name;
@PostConstruct
public void init()
{
If (name == null) {
throw new IllegalArgumentException("");
}
}
private void setName(String name) {
this.name = name;
}
}
class Foo {
@Autowired
private BlahService service;
}
Run Code Online (Sandbox Code Playgroud)
确保name被设置的正确方法是BlahService什么?
我想,你有类似
@Bean
public BlahService getBlahService() {
Blahservice bean = new BlahService();
return bean;
}
Run Code Online (Sandbox Code Playgroud)
并且您必须将其修改为
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public BlahService getBlahService() {
Blahservice bean = new BlahService();
bean.setName( findProperName() );
retunrn bewn;
}
Run Code Online (Sandbox Code Playgroud)
完整的测试是:
主要
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(Config.class);
BlahService bean1 = ac.getBean(BlahService.class);
System.out.println(bean1.getName());
BlahService bean2 = ac.getBean(BlahService.class);
System.out.println(bean2.getName());
FooService bean3 = ac.getBean(FooService.class);
bean3.print();
}
}
Run Code Online (Sandbox Code Playgroud)
BlahService
package test;
public class BlahService {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
FooService
package test;
import org.springframework.beans.factory.annotation.Autowired;
public class FooService {
@Autowired
BlahService blahService;
public void print() {
System.out.println("FooService#print: " + blahService.getName());
}
}
Run Code Online (Sandbox Code Playgroud)
设定档
package test;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
@Configuration
public class Config {
static int counter = 0;
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public BlahService getBlahService() {
BlahService bean = new BlahService();
bean.setName("name" + counter++);
return bean;
}
@Bean
public FooService getFooService () {
return new FooService();
}
}
Run Code Online (Sandbox Code Playgroud)
执行Main#main打印:
@Bean
public BlahService getBlahService() {
Blahservice bean = new BlahService();
return bean;
}
Run Code Online (Sandbox Code Playgroud)
编辑(扩展)
JUnit的
package test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=Config.class)
public class MyTest {
@Autowired
BlahService blahService;
@Autowired
FooService fooService;
@Test
public void test() {
System.out.println(blahService.getName());
fooService.print();
}
}
Run Code Online (Sandbox Code Playgroud)
印刷品:
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public BlahService getBlahService() {
Blahservice bean = new BlahService();
bean.setName( findProperName() );
retunrn bewn;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
819 次 |
| 最近记录: |