[英]Spring Bean and @Autowired constructor with params
我想了解是否可以使用以及如何使用@Autowired Constructor和params進行Bean操作。
@Component
public class Routes
{
private Foo req;
@Autowired
public Routes(Foo req)
{
this.req = req;
}
public String getUrl(String destin)
{
return req.getContextPath() + destin;
}
}
@Component
public class HomeController
{
@Autowired
private Routes routes;
public HomeController(Foo req)
{
String foo = routes.getUrl("something");
}
}
REAL CODE ------編輯---------------異常發生在這一行:String foo = rt.getUrl(“caca”);
public class AppRun extends HttpServlet {
private static final long serialVersionUID = -3308874705513248491L;
private ApplicationContext context;
@Override
public void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
FooTest ft = new FooTest();
HomeControllerTest hc = (HomeControllerTest) context.getBean("homeControllerTest", new Object[]{ft});
}
}
@Component
@Scope("prototype")
public class FooTest {
public String mensagem()
{
System.out.println("funcionou");
return "ok";
}
}
@Component
@Scope("prototype")
public class RoutesTest {
private FooTest req;
@Autowired
public RoutesTest(FooTest req)
{
this.req = req;
}
public String getUrl(String destin)
{
return req.mensagem().concat(destin);
}
}
@Component
@Scope("prototype")
public class HomeControllerTest {
@Autowired
private RoutesTest rt;
public HomeControllerTest(FooTest req)
{
String foo = rt.getUrl("caca");
System.out.println(foo);
}
}
問題是您正在構造函數中訪問尚未估值的屬性:Spring必須先創建對象,然后才能設置@Autowired屬性rt。 將參數RoutesTest rt
添加到構造函數,或將構造函數邏輯移動到afterPropertiesSet
方法。
以下是如何使用構造函數更改失敗的類:
@Component
@Scope("prototype")
public class HomeControllerTest {
private RoutesTest rt;
@Autowired
public HomeControllerTest(FooTest req, RoutesTest rt)
{
this.rt = rt;
String foo = rt.getUrl("caca");
System.out.println(foo);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.