CommandLineRunner and Beans (Spring) -


code question about:

   @springbootapplication public class application {      private static final logger log = loggerfactory.getlogger(application.class);      public static void main(string args[]) {         springapplication.run(application.class);     }      @bean     public object test(resttemplate resttemplate) {         quote quote = resttemplate.getforobject(                 "http://gturnquist-quoters.cfapps.io/api/random", quote.class);         log.info(quote.tostring());         return new random();     }      @bean     public resttemplate resttemplate(resttemplatebuilder builder) {         return builder.build();     }      @bean     public commandlinerunner run(resttemplate resttemplate) throws exception {         return args -> {             quote quote = resttemplate.getforobject(                     "http://gturnquist-quoters.cfapps.io/api/random", quote.class);             log.info(quote.tostring());         };     } } 

i'm new spring. far understood @bean annotation responsible object saved in ioc container, correct?

if so: first methods @bean collected , then executed?

in example added method test() same run() returns object (random()) instead. result same working commandlinerunner , object.

is there reason why should return commandlinerunner i.e. use syntax run()?

moreover: @ point don't see far advantage move methods container. why not execute it?

thank you!

@configuration classes (@springbootapplication extends @configuration) place spring beans registered. @bean used declare spring bean. method annotated @bean has return object(the bean). default spring beans singletons, once method annotated @bean executed , returns it's value object lives til end of application.

in case

    @bean     public object test(resttemplate resttemplate) {         quote quote = resttemplate.getforobject(                 "http://gturnquist-quoters.cfapps.io/api/random", quote.class);         log.info(quote.tostring());         return new random();     } 

this produce s singleton bean of type random name 'test'. if try inject (e.g. @autowire) bean of type or name in other spring bean value. not use of @bean annotation, unless want that.

commandlinerunner on other hand special bean lets execute logic after application context loaded , started. makes sense use resttemplate here, call url , print returned value.

not long ago way register spring bean xml. had xml files , bean declarations this:

<bean id="mybean" class="org.company.myclass">   <property name="somefield" value="1"/> </bean> 

the @configuration classes equivalent of xml files , @bean methods equivalent of <bean> xml element.

so it's best avoid executing logic in bean methods , stick creating objects , setting properties.


Comments

Popular posts from this blog

php - Permission denied. Laravel linux server -

google bigquery - Delta between query execution time and Java query call to finish -

python - Pandas two dataframes multiplication? -