spring boot bean 的基本定义与使用

Spring 的bean是如何被创建出来的 ?

在老版本 spring bean 的创建是通过 xml 方式配置也加载并创建起来的,但是在 spring boot 的大环境下,这种方式已经不推荐使用了,我们今天主要讲 sprint boot 方式创建bean , 它的方式如下:

  • 通过注解方式

    通过 @Component 注解, 在类的上面添加注解

    @Component
    public class TestBean {
    }
    

    通过 @Bean 注解,在方法上添加注解,如下

    public class User {
    }
    
    @Configuration
    public class BeanLoadConfig {
    
        @Bean
        public User getUser() {
            return new User();
        }
    }
    

    注意:

    这种方法是需要配置 @Configuration 来使用,

    如果在实际测试时,发现无法获取上面的bean,就需要注意下bean的包路径,是否在被你程序的扫描路径包含! 也就是用 @ComponentScan 注解, 如

    package com.pangugle.testspringboot;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.ComponentScan;
    
    @SpringBootApplication
    @ComponentScan(basePackages = {
    		"com.pangugle"
    })
    public class App
    {
        public static void main( String[] args )
        {
        	SpringApplication.run(App.class, args);
        }
    }
    

    以上 我们通过 @ComponentScan 加载 com.pangugle 包下面的spring bean !

  • 通过 工厂类 的方式

    这种方式在实际的业务场景中应用不是很多,但是在抽象的框架层面应用很广! 它主要是通过 FactoryBean 来实现!

    public class User {
    }
    
    public class UserBeanFactory implements FactoryBean<User> {
        @Override
        public User getObject() throws Exception {
            return new User();
        }
    
        @Override
        public Class<?> getObjectType() {
            return User.class;
        }
    
        @Override
        public boolean isSingleton() {
            return true;
        }
    }
    
    @Configuration
    public class BeanLoadConfig {
        @Bean
        public UserBeanFactory factoryBean() {
            return new UserBeanFactory();
        }
    
        @Bean
        public User facDemoBean(UserBeanFactory factoryBean) throws Exception {
            return factoryBean.getObject();
        }
    }
    

Bean 注入

spring bean 的注入可以通过 @Autowired 来完成

  • 注解在成员变量上

    @RestController
    public class HelloController {
      @Autowired
      private User mUser
    }
    
  • 注解在方法上

    @RestController
    public class HelloController {
    
      private User mUser
    
      @Autowired
      public void setUser(User user)
      {
        this.mUser = user;
      }
    
    }
    
  • 构造函数上,什么都不用,由框架自动装配

    @RestController
    public class HelloController {
      private User mUser
      public HelloController(User user) {
        this.mUser = user;
      }
    }