Bean的定义与获取
在Spring 中定义Bean的方式主要有三种:
1、基于XML配置文件的方式(了解):通常会在配置文件中使用<bean>标签来定义Bean,并设置Bean的属性、依赖关系等信息。
2、基于注解的方式:在Java代码中使用注解来标识Bean,并指定Bean的属性、依赖关系等信息。常用的注解有@Component、@Controller、@Service等。
- @Component用于标识一个普通的 Bean 类,没有任何特殊的业务含义
- @Controller 用于标识一个控制器类、@Service 用于标识一个服务类,通常用于业务处理层、@Repository 注解用于标识一个数据访问类
- 除了这些区别,它们的使用方式是一样的,本质上都是将被注解的类交由 Spring 容器管理,供其他类去使用
3、基于Java Config的方式,在Java配置类中使用@Bean注解来定义Bean。当开发者想要使用的Bean是第三方组件时,不能在源码上标注@Component,可以使用@Bean注解的方式。
- @Bean注解通常放在方法上,用于指示该方法返回的实例应该被注册为Spring容器中的一个Bean
- 在方法上使用@Bean注解时,Spring框架会根据该方法的返回类型来自动创建并配置该Bean,同时也会根据方法的名称来为该Bean指定一个默认的名称
- 可以通过为@Bean添加属性值的方式为Bean定义一个新的名称
总的来说,不同的方式适用于不同的场景。在实际使用过程中,我们可以根据业务需求来选择最适合的方式来定义Bean,也可以兼用多种方式来定义Bean,这些方式也是可以共存的。
并在其中使用@Bean注解方式声明Bean:
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.ComponentScan;
- import org.springframework.context.annotation.Configuration;
- import java.util.ArrayList;
- @Configuration
- @ComponentScan("cn.highedu")
- public class BeanDefineConfig {
- /**
- * 使用@Bean 显示声明Java Bean 组件
- * Bean ID 为 names
- * @return 创建的JavaBean
- */
- @Bean
- public ArrayList<String> names(){
- ArrayList<String> names = new ArrayList<>();
- names.add("Tom");
- names.add("Jerry");
- return names;
- }
- /**
- * 使用 @Bean的属性设置BeanID
- * @return 编程语言列表
- */
- @Bean("languages")
- public ArrayList<String> list(){
- ArrayList<String> list = new ArrayList<>();
- list.add("Java");
- list.add("Java Script");
- return list;
- }
- /**
- * 使用@Bean 还可以在方法参数中引入其他的Bean
- * 本例中引入了名为languages的Bean
- * @param languages
- * @return
- */
- @Bean
- public ArrayList<String> moreLanguages(ArrayList<String> languages){
- ArrayList moreLanguages = new ArrayList(languages);
- moreLanguages.add("Python");
- moreLanguages.add("SQL");
- return moreLanguages;
- }
- }
然后,在Application类中测试Bean的创建效果:
- public class Application {
- public static void main(String[] args) {
- ApplicationContext context =
- new AnnotationConfigApplicationContext(BeanDefineConfig.class);
- // 通过Spring IOC容器对象获取Bean的对象
- ArrayList<String> names = (ArrayList<String>) context.getBean("names");
- names.forEach(System.out::println);
- System.out.println();
- // 通过Spring IOC容器对象获取Bean的对象
- ArrayList<String> moreCities = (ArrayList<String>) context.getBean("moreCities");
- moreCities.forEach(System.out::println);
- }
- }