Spring中,使用Java配置的方式进行依赖注入

Posted 博客王大锤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring中,使用Java配置的方式进行依赖注入相关的知识,希望对你有一定的参考价值。

之前用spring的时候,只知道使用xml的方式,和使用注解的方式,却一直不知道在spring中,还可以使用Java类的方式进行配置。使用Java类的方式,就可以取代xml和注解。使用Java配置是Spring4版本的推荐的配置方式,在spring boot中得到了很广泛的应用,也是spring boot推荐的配置方式。

今天大概学习了一下,怎么使用java配置的方式对spring进行配置来使用以来注入功能。

首先我们演示使用注解的方式配置spring,注解的一些功能全部以注释的形式展示。Spring容器类选用AnnotationConfigApplicationContext。

  • 功能类1,FunctionService
package site.wangxin520.springstudy.dependency.injection;

import org.springframework.stereotype.Service;

//使用@service注解声明当前的类,是spring管理的一个Bean
//可以根据需要,选择@Component @Servie @Repository @Controller
@Service
public class FunctionService {
    
    /**
     * 返回一个字符串,在参数字符串前面加入hello,拼成一个新字符串
     * @param word
     * @return
     */
    public String sayHallo(String word){
        return "hello "+word+" !";
    }
    
}
  • 功能类2,UseFunctionService
package site.wangxin520.springstudy.dependency.injection;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserFuctionService {

    //@Autowired是自动注入的注解,将实例化好的FunctionService类注入到本类中的属性。
    @Autowired
    FunctionService functionService;
    
    public String sayHello(String word){
        return functionService.sayHallo(word);
    }
    
}
  • 配置类DiConfig
package site.wangxin520.springstudy.dependency.injection;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * 配置类
 * @author wangXgnaw
 *
 */
@Configuration//声明当前类是一个配置类
@ComponentScan("site.wangxin520.springstudy")//相当于xml中配置到 扫描包
public class DiConfig {

}
  • Test测试类
package site.wangxin520.springstudy.dependency.injection;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test {

    public static void main(String[] args) {

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DiConfig.class);

        UserFuctionService userFuctionService = context.getBean(UserFuctionService.class);
        String sayHello = userFuctionService.sayHello("小帅哥,快来玩呀");
        System.out.println(sayHello);
        
    }

}
  • 控制台输出为

image

完全可以运行,而本例子中,没有配置任何xml文件。


下面介绍另一种方式,不在类上面使用注解,而直接使用Java配置。

同样,还是上面的列子,不过在新例子中,去掉了@Service和@AutoWired注解

  • FunctionService功能类1
package site.wangxin520.springstudy.javaconf;

public class FunctionService {

    public String sayHallo(String word){
        return "hello "+word+" !";
    }
}
  • UserFunctionService功能类2
package site.wangxin520.springstudy.javaconf;

public class UserFuctionService {

    FunctionService functionService;

    public void setFunctionService(FunctionService functionService) {
        this.functionService = functionService;
    }

    public String sayHello(String word) {
        return functionService.sayHallo(word);
    }

}
  • JavaConfig
package site.wangxin520.springstudy.javaconf;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
//这里注意的是,没有使用包扫描的注解
public class JavaConfig {

    @Bean//使用Bean注解声明当前方法的返回值是一个Bean,名称就是方法名
    public FunctionService functionService(){
        return new FunctionService();
    }
    
    @Bean
    public UserFuctionService  userFuctionService(){
        //当使用userFunctionService时候,就会调用这个里面的方法去获取bean
        UserFuctionService userFuctionService=new UserFuctionService();
        userFuctionService.setFunctionService(functionService());
        return userFuctionService;
        
    }
    
    @Bean//这是另外一种注入的方式,直接使用参数注入的方式
    public UserFuctionService userFuctionService(FunctionService functionService){
        
        UserFuctionService userFuctionService=new UserFuctionService();
        userFuctionService.setFunctionService(functionService());
        return userFuctionService;
        
    }
    
}
  • Test
package site.wangxin520.springstudy.javaconf;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test {

    public static void main(String[] args) {

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig.class);

        UserFuctionService userFuctionService = context.getBean(UserFuctionService.class);
        String sayHello = userFuctionService.sayHello("小帅哥,快来玩呀");
        System.out.println(sayHello);
        
    }

}
  • 控制台输出

image

 

表示,这个还没有xml方便,不喜欢。

以上是关于Spring中,使用Java配置的方式进行依赖注入的主要内容,如果未能解决你的问题,请参考以下文章

如何通俗的理解java的依赖注入

关于Spring依赖注入的问题

Spring_002 依赖注入方式实现

10分钟学Spring:一文搞懂spring依赖注入(DI)

[刘阳Java]_Spring相关配置介绍_第5讲

Spring 依赖注入