Spring injection with java annotation?

Discussion in 'Java' started by Alberto Sfolcini, Apr 24, 2008.

  1. Hi,

    I am wondering if I can use an annotation to inject property and avoid
    to write getters and setters for each property.

    Let's suppose my spring's bean looks like:

    <bean id="test" class="foo.bar.Test">
    <property name="debug" value="true"/>
    <property name="firstname" value="Bill" />
    <property name="lastname" value="Gates" />
    </bean>

    The Test class should look like:

    public class Test{
    private boolean debug;
    private String firstname;
    private String lastname;

    // Setters and getters...

    public void setFirstname(String furstname) {
    this.firstname = firstname;
    }

    etc etc...

    }

    What I would like to obtain is to avoid the setters and getters
    methods by using an annotation:

    public class Test{
    @Inject(name="debug", optional="false")
    private boolean debug;
    @Inject
    private String firstname;
    @Inject
    private String lastname;
    }

    So, let's see the @Inject interface:

    public @interface Inject {
    String name() default "";
    boolean optional() default false;
    }

    Now, what I am missing is the injection engine, that should be written
    in a class that extends the ApplicationContext I guess.

    Can somebody give some help?

    thanks
     
    Alberto Sfolcini, Apr 24, 2008
    #1
    1. Advertising

  2. On Apr 24, 8:46 am, Alberto Sfolcini <> wrote:
    > Hi,
    >
    > I am wondering if I can use an annotation to inject property and avoid
    > to write getters and setters for each property.
    >
    > Let's suppose my spring's bean looks like:
    >
    > <bean id="test" class="foo.bar.Test">
    >     <property name="debug" value="true"/>
    >     <property name="firstname" value="Bill" />
    >     <property name="lastname" value="Gates"  />
    > </bean>
    >
    > The Test class should look like:
    >
    > public class Test{
    >    private boolean debug;
    >    private String firstname;
    >    private String lastname;
    >
    >    // Setters and getters...
    >
    >    public void setFirstname(String furstname) {
    >       this.firstname = firstname;
    >    }
    >
    >   etc etc...
    >
    > }
    >
    > What I would like to obtain is to avoid the setters and getters
    > methods by using an annotation:
    >
    > public class Test{
    >    @Inject(name="debug", optional="false")
    >    private boolean debug;
    >    @Inject
    >    private String firstname;
    >    @Inject
    >    private String lastname;
    >
    > }
    >
    > So, let's see the @Inject interface:
    >
    > public @interface Inject {
    >         String name() default "";
    >         boolean optional() default false;
    >
    > }
    >
    > Now, what I am missing is the injection engine, that should be written
    > in a class that extends the ApplicationContext I guess.
    >
    > Can somebody give some help?
    >
    > thanks


    @Autowired.

    Spring supports most of the behaviour you want already, at least as of
    2.5-series releases (and possibly 2.0-series releases).

    Docs link: <http://static.springframework.org/spring/docs/2.5.x/
    reference/beans.html#beans-annotation-config>

    However, it will still use setFoo injection or constructor arguments -
    you can't get away from that without rewriting part of Spring's actual
    injection mechanism (which is well-buried). Furthermore, you don't
    need to provide set/get pairs for properties you want injected: a set
    method is enough. The only reason to add a get method is if you plan
    on using the property elsewhere via its get method.

    -o
     
    Owen Jacobson, Apr 24, 2008
    #2
    1. Advertising

  3. Alberto Sfolcini

    Chris Seidel Guest

    Owen Jacobson wrote:
    > @Autowired.


    > However, it will still use setFoo injection


    You do not need a setter, works with a private field too.
     
    Chris Seidel, Apr 24, 2008
    #3
  4. On 24 Apr, 17:07, "Chris Seidel" <> wrote:
    > Owen Jacobson wrote:
    > > @Autowired.
    > > However, it will still use setFoo injection

    >
    > You do not need a setter, works with a private field too.



    Yes it works fine without a setter method, but it is not exactly what
    I wanted.
    Let's say that it wires with types, I read it's also possible to wire
    by names, I have to look at it deeply.
    thanks.
     
    Alberto Sfolcini, Apr 24, 2008
    #4
  5. On 24 Apr, 17:07, "Chris Seidel" <> wrote:
    > Owen Jacobson wrote:
    > > @Autowired.
    > > However, it will still use setFoo injection

    >
    > You do not need a setter, works with a private field too.


    // autowiring by Name
    @Autowired
    @Qualifier("yourObjectName")


    Is there a way to merge these annotation into one? for example
    ( @Inject(name="yourObjectName", required=true) ?
    Any ideas?
     
    Alberto Sfolcini, Apr 24, 2008
    #5
  6. Alberto Sfolcini

    Chris Seidel Guest

    Alberto Sfolcini wrote:
    > // autowiring by Name
    > @Autowired
    > @Qualifier("yourObjectName")
    >
    >
    > Is there a way to merge these annotation into one? for example
    > ( @Inject(name="yourObjectName", required=true) ?
    > Any ideas?


    Look into the component-scanner code how the annotations are found.
    But I think you have to chance the scanner.
    Why not 3 annotations?
     
    Chris Seidel, Apr 24, 2008
    #6
  7. On 24 Apr, 18:20, "Chris Seidel"
    > Look into the component-scanner code how the annotations are found.
    > But I think you have to chance the scanner.
    > Why not 3 annotations?


    No problem at all even with 3 annotations.
    I was thinking if is possible to use annotation even with Struts2 in
    order to avoid setters and getters.
    Do you know something about it?

    bye
     
    Alberto Sfolcini, Apr 30, 2008
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Danno
    Replies:
    2
    Views:
    677
    Danno
    Mar 23, 2007
  2. pek
    Replies:
    2
    Views:
    1,077
  3. rmn190
    Replies:
    2
    Views:
    2,366
    Arne Vajhøj
    Jan 10, 2008
  4. Goldfish
    Replies:
    1
    Views:
    719
    Goldfish
    Nov 6, 2008
  5. Replies:
    7
    Views:
    1,213
Loading...

Share This Page