SpringBoot中定义Bean的两种方式

  |   0 评论   |   455 浏览

背言

前面进行了SpringBoot中的注解学习

本文再单独记录一下SpringBoot中Bean两种定义方式。

Bean定义方式

@Service

定义接口

package com.example.beandemo.bean.service;

public interface EchoService {
    String echo(String name);
}

定义实现

实现中使用了@Service注解

package com.example.beandemo.bean.service;

import org.springframework.stereotype.Service;

@Service
public class ConsoleEchoService implements EchoService {
    @Override
    public String echo(String name) {
        return "Console: hello " + name;
    }
}

使用

package com.example.beandemo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.beandemo.bean.service.EchoService;

@RestController
public class EchoController {

    @Autowired
    EchoService echoService;

    @RequestMapping(value = "/echo")
    public String echo(String name) {
        return echoService.echo(name);
    }
}

效果

[note@abeffect ~]$ curl "localhost:8080/echo?name=note"
Console: hello note

@Configuration和@Bean

实现类

实现类,注意其中没有@Service标签

package com.example.beandemo.bean.config;

import com.example.beandemo.bean.service.EchoService;

public class WebEchoService implements EchoService {
    @Override
    public String echo(String name) {
        return "Web: hello " + name;
    }
}

配置类

配置类中使用了@Bean注解

package com.example.beandemo.bean.config;

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

import com.example.beandemo.bean.service.EchoService;

@Configuration
public class WebEchoConfig {

    @Bean
    public EchoService echoService() {
        return new WebEchoService();
    }
}

两种方式比较

@Service中,同时完成了两件事情:

  • 实现类的创建
  • 将实现类标识为Bean

在第二种方式中:

  • 实现类的创建:交给了单独的类
  • 将实现类标识为Bean:通过接口名称和类的名称

即方式二中将Bean的标识,和类的实现过程,进行了分离。

在复杂的项目中,推荐使用第二种方式。

附录

@Component、@Repository、@Service、@Controller区别

效果上,这四个是一样的。

注解 使用范围 备注
@Controller RequestMapping处理相关
@Repository 存储相关
@Service 模型相关
@Component 其它相关

根据不同的Profile使用不同的Bean

package com.example.beandemo.bean.config;

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

import com.example.beandemo.bean.service.EchoService;

@Configuration
public class WebEchoConfig {

    @Profile("!dev")
    @Bean
    public EchoService echoService() {
        return new WebEchoService();
    }

    @Profile("dev")
    @Bean
    public EchoService mockEchoService() {
        return new MockWebEchoService();
    }
}

参考

评论

发表评论

validate