Search code examples
springspring-mvcannotationsautowiredstruts2-spring-plugin

Spring @Autowired annotaion


Spring @Autowired

I have a doubt on Spring @Autowired annotation.Please Help...

In Spring mvc ,when I tried @Autowired in this order

Controller--->Service--->Dao

ie,In Controller I autowired Service Class Object , In Service Class Autowire Dao Object.

This Injection chain works perfectly.

Similliarly In strutrs2+Spring ,I applied @Autowired Annotation in this way

Action--->Service-->Dao

This Injection chain also works fine.

If I call a funtion from outside this chain (eg:Custom Taglib class (from jsp)) to funtion in Service class Then in this Service class the Autowired dao object is null(ie,this call braks the chain).

My questions is

Is this @Autowired works in a Injection chain Only?


Solution

  • Beans that have @Autowired fields only have them set if they are sent through the Spring Bean Postprocessor -- that is, like you said, if you autowire them yourself. That is a big reason that constructor injection is much more preferred than field injection. Instead of doing

    @Service
    public class MyService {
         @Autowired
         private MyDao dao;
    
         ...
    }
    

    you should do

    @Service
    public class MyService {
        private final MyDao dao;
    
        @Autowired
        public MyService(MyDao dao) {
            this.dao = dao;
        }
    }
    

    That way, when you're in a situation where you can't rely on a service to be post-processed (as in your case of using the jsp tag library), you can simply instantiate a new instance with a MyDao object and be on your merry way.