欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring入门学习笔记(2)——基于Java的配置

程序员文章站 2022-04-06 13:02:48
[TOC] 基于Java的配置 @Configuration & @Bean Annotations 使用@Configuration注释类表示,Spring IoC容器可以将该类用作bean定义的源。@Bean注释告诉Spring,用@Bean注释的方法将返回一个应该在Spring应用程序上下文中 ......

目录

基于java的配置

@configuration & @bean annotations

使用@configuration注释类表示,spring ioc容器可以将该类用作bean定义的源。@bean注释告诉spring,用@bean注释的方法将返回一个应该在spring应用程序上下文中注册为bean的对象。最简单的@configuration类如下所示:

package com.tutorialspoint;
import org.springframework.context.annotation.*;

@configuration
public class helloworldconfig {
   @bean 
   public helloworld helloworld(){
      return new helloworld();
   }
}

它和以下的xml方式定义的是等价的:

<beans>
   <bean id = "helloworld" class = "com.tutorialspoint.helloworld" />
</beans>

带@bean的方法名作为bean id注释,他创建并返回实际的bean。一个配置类可以拥有多个bean的声明。一旦定义了配置类,你可以通过 annotationconfigapplicationcontex加载并获取
他们。

public static void main(string[] args) {
   applicationcontext ctx = new annotationconfigapplicationcontext(helloworldconfig.class);
   
   helloworld helloworld = ctx.getbean(helloworld.class);
   helloworld.setmessage("hello world!");
   helloworld.getmessage();
}

也可以获取加载不同的configuration

public static void main(string[] args) {
   annotationconfigapplicationcontext ctx = new annotationconfigapplicationcontext();

   ctx.register(appconfig.class, otherconfig.class);
   ctx.register(additionalconfig.class);
   ctx.refresh();

   myservice myservice = ctx.getbean(myservice.class);
   myservice.dostuff();
}

example

helloworldconfig.java

@configuration
public class helloworldconfig {
   @bean 
   public helloworld helloworld(){
      return new helloworld();
   }
}

helloworld.java

public class helloworld {
   private string message;

   public void setmessage(string message){
      this.message  = message;
   }
   public void getmessage(){
      system.out.println("your message : " + message);
   }
}

mainapp.java

public class mainapp {
   public static void main(string[] args) {
      applicationcontext ctx = 
         new annotationconfigapplicationcontext(helloworldconfig.class);
   
      helloworld helloworld = ctx.getbean(helloworld.class);
      helloworld.setmessage("hello world!");
      helloworld.getmessage();
   }
}

输出:

your message : hello world!

注入bean依赖

当@ bean相互依赖时,表示依赖关系就像让一个bean方法调用另一个bean一样简单,如下所示

@configuration
public class appconfig {
    @bean
    public foo foo() {
        return new foo(bar());
    }
    
    @bean
    public bar bar() {
        return new bar();
    }
}

foo bean通过构造函数注入接收到bar的引用

example

texteditorconfig.java

@configuration
public class texteditorconfig {
   @bean 
   public texteditor texteditor(){
      return new texteditor( spellchecker() );
   }

   @bean 
   public spellchecker spellchecker(){
      return new spellchecker( );
   }
}

texteditor.java

public class texteditor {
   private spellchecker spellchecker;

   public texteditor(spellchecker spellchecker){
      system.out.println("inside texteditor constructor." );
      this.spellchecker = spellchecker;
   }
   public void spellcheck(){
      spellchecker.checkspelling();
   }
}

spellchecker.java

public class spellchecker {
   public spellchecker(){
      system.out.println("inside spellchecker constructor." );
   }
   public void checkspelling(){
      system.out.println("inside checkspelling." );
   }
}

mainapp.java

public class mainapp {
   public static void main(string[] args) {
      applicationcontext ctx = 
         new annotationconfigapplicationcontext(texteditorconfig.class);

      texteditor te = ctx.getbean(texteditor.class);
      te.spellcheck();
   }
}

输出:

inside spellchecker constructor.
inside texteditor constructor.
inside checkspelling.

@import注解

@import注解允许在一个configuration中导入另外一个配置类。

@configuration
public class configa {
   @bean
   public a a() {
      return new a(); 
   }
}
@configuration
@import(configa.class)
public class configb {
   @bean
   public b a() {
      return new a(); 
   }
}

这样,只需要加载configb,则可以加载a,b两个配置文件,而不需要一样加载两次.

lifecycle callbacks(声明周期回调)

@bean注释支持指定任意的初始化和销毁回调方法,就像spring xml的init方法和销毁方法。

public class foo {
   public void init() {
      // initialization logic
   }
   public void cleanup() {
      // destruction logic
   }
}
@configuration
public class appconfig {
   @bean(initmethod = "init", destroymethod = "cleanup" )
   public foo foo() {
      return new foo();
   }
}

指定bean的作用域

默认作用域是singleton,可以通过以下方法重写:

@configuration
public class appconfig {
   @bean
   @scope("prototype")
   public foo foo() {
      return new foo();
   }
}