1. 概述
在Spring Boot应用程序中,定义Bean是非常常见的操作,它是构建应用程序的基础。Spring Boot提供了多种方式来定义Bean,每种方式都有其适用的场景和优势。
2. 方式
2.1. @Bean
@Bean public User getUser(){ return new User(); }
@Bean用于告诉Spring框架,被注解的方法将返回一个对象,该对象将被注册为Spring应用程序上下文中的bean。
@Bean注解通常用于配置类中的方法,用于创建和配置bean实例。通常第三方Bean需要在配置类中,使用该方式注册
2.2. @Component
@Component public class TestBean { }
@Component是Spring框架中用于标识类为Spring组件的注解。这意味着这些类可以被Spring容器管理,可以进行依赖注入,可以通过@Autowired或@Resources注解进行自动装配等。
被@Component标记的类要放在启动类的目录或者子目录下,不然需要在加上@ComponentScan来扫描
常用衍生的注解有
注解名 |
应用 |
@Controller @RestController |
控制器类注解 |
@Service |
业务逻辑类注解 |
@Repository |
实体类注解 |
@Configuration |
配置类 |
@ControllerAdvice @RestControllerAdvice |
全局异常处理类注解 |
多文警告
@Component是Spring框架中用于标识类为Spring组件的注解。被@Component注解标识的类将被Spring自动扫描并注册为Spring应用程序上下文中的bean。这意味着这些类可以被Spring容器管理,可以进行依赖注入,可以通过@Autowired或@Resources注解进行自动装配等。@Component注解通常用于标识那些通用的**、没有特定角色的类**,例如业务逻辑类、数据访问类、工具类等。当一个类被标识为@Component时,Spring容器会自动创建该类的实例,并将其纳入到容器的管理之中。@Component注解是Spring框架中最常用的注解之一,它是实现Spring依赖注入和管理的基础。
@Controller是Spring框架中用于标识类为控制器的注解。被@Controller注解标识的类通常用于处理用户请求和返回相应的视图。在Spring MVC框架中,控制器类负责接收用户请求、调用业务逻辑处理、选择合适的视图进行展示等工作。被@Controller注解标识的类通常用于处理Web请求,并且可以结合@RequestMapping注解来指定处理请求的URL路径。
当一个类被标识为@Controller时,Spring框架会将其识别为控制器,并将其纳入到Spring MVC框架的管理之中。这样,该类就可以处理用户请求,并返回相应的视图。@Controller注解是Spring MVC框架中最常用的注解之一,用于标识控制器类,实现Web请求的处理和视图的返回。
@RestController是@Controller和@ResponseBody的组合注解,被@RestController注解标识的类表示该类中的方法返回的数据将直接写入HTTP响应体中,而不会进行视图解析。这意味着被@RestController注解标识的类通常用于编写RESTful风格的控制器,返回的数据可以是JSON、XML等格式的数据,而不是HTML视图。
与@Controller注解不同的是,@RestController注解不需要在每个方法上添加@ResponseBody注解来指示返回的数据写入响应体中,因为@RestController已经默认包含了@ResponseBody的功能。
总之,@RestController注解用于标识一个类为RESTful风格的控制器,用于处理HTTP请求并返回数据,而不是视图。
@Service和@Repository是Spring框架中用于标识类的注解,用于在Spring应用程序中指定类的角色和功能。@Service注解通常用于标识业务逻辑层(service层)的类,表示该类是业务逻辑处理的组件。
被@Service注解标识的类通常包含业务逻辑的处理,例如数据处理、计算、验证等。这些类通常被用于处理业务逻辑,而不是直接与数据库交互。
@Repository注解通常用于标识数据访问层(DAO层)的类,表示该类是用于数据访问和持久化的组件。被@Repository注解标识的类通常包含对数据库的访问操作,例如增删改查等数据库操作。
@ControllerAdvice是Spring MVC框架中用于全局处理异常的注解。
被@ControllerAdvice注解标识的类可以用于定义全局的异常处理器,可以捕获应用程序中所有控制器抛出的异常,并进行统一的处理。
@RestControllerAdvice注解结合@ControllerAdvice和@ResponseBody的功能,用于定义全局的异常处理器,并且返回的数据将直接写入HTTP响应体中。
被@RestControllerAdvice注解标识的类可以用于捕获应用程序中所有控制器抛出的异常,并进行统一的处理,同时返回的数据可以是JSON、XML等格式的数据。这样可以使异常处理更加统一和方便,并且返回的数据格式符合RESTful风格。
@Configuration是Spring框架中的注解,用于标识一个类是配置类,通常与@Bean注解一起使用,用于定义Spring应用程序的配置信息。
当一个类被@Configuration注解标识时,Spring容器会将其识别为配置类,并在应用程序启动时进行加载和解析。在@Configuration类中,可以使用@Bean注解定义Spring Bean,用@Bean注解的方法将返回一个对象,并由Spring容器进行管理和注入。
@Configuration类通常用于定义数据源、事务管理器、消息队列等与系统配置相关的内容。通过@Configuration注解,可以将应用程序的配置信息集中在一个类中,便于管理和维护。
//@Controller @RestController public class TestController { @GetMapping("/test") @ResponseBody public String test() { return "测试"; } } @Service public class TestService { } @Repository public class TestDao { } @Configuration public class TestConfig { } @ControllerAdvice //@RestControllerAdvice public class TestBeanAdvice implements ResponseBodyAdvice { @Override public boolean supports(MethodParameter returnType, Class converterType) { return false; } @Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { return null; } }
2.3. @Import
@SpringBootApplication @Import(TestService.class) public class InterviewTestApplication { public static void main(String[] args) { SpringApplication.run(InterviewTestApplication.class, args); } }
@Import是Spring框架中的注解,用于在配置类中引入其他配置类或者普通的Java类。当一个类被@Import注解标识时,它可以引入其他配置类,从而将其他配置类中定义的Bean引入到当前的配置类中。
这样可以实现配置类的模块化管理,将不同功能的配置分开,提高配置类的可维护性和可读性。
@Import注解还可以用于引入普通的Java类,这样可以将一些通用的Java类引入到配置类中,方便在配置类中进行使用。
2.4. BeanDefinition
public class TestBeanDefinitionRegister implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) { AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition(); beanDefinition.setBeanClass(User.class); registry.registerBeanDefinition("user",beanDefinition); } }
在启动类中引用
@SpringBootApplication @Import(TestBeanDefinitionRegister.class) public class InterviewTestApplication { public static void main(String[] args) { SpringApplication.run(InterviewTestApplication.class, args); } }
在Spring框架中,BeanDefinition是一个接口,用于描述一个bean的配置元数据。BeanDefinition中包含了bean的类名、作用域、构造函数参数、属性值、初始化方法、销毁方法等配置信息。
BeanDefinition是Spring IoC容器中用于管理bean定义的核心接口,它是Spring框架中bean工厂的基础。在Spring容器启动时,会解析配置文件或注解,将bean的配置信息解析成BeanDefinition对象,并注册到容器中。
通过BeanDefinition,Spring容器可以了解每个bean的配置信息,从而实例化和管理bean。BeanDefinition中的配置信息包括了bean的各种属性和行为,通过这些信息,Spring容器可以实例化bean、进行依赖注入、初始化和销毁bean等操作。