当前位置: 首页 > 后端技术 > Java

面试必问!Spring@bean和@component注解有什么区别?

时间:2023-04-01 19:51:45 Java

来源:blog.csdn.net/weixin_35544490/article/details/112143211本文打算介绍几个Spring注解,不太好区分或使用,比如@Component和@Bean的比较,如何@ControllerAdvice是处理自定义异常等等。Spring中的一些注解1、@Component和@Bean有什么区别?作用对象不同:@Component注解作用于类,而@Bean注解作用于方法。@Component通常是通过路径扫描自动检测并自动组装到Spring容器中(我们可以使用@ComponentScan注解来定义要扫描的路径,从中找出标识需要组装的类并自动组装到Spring的bean容器中).@Bean注解通常表示我们在注解标注的方法中定义并生成这个bean。@Bean告诉Spring这是某个类的实例,等我们需要用到的时候返回给我。@Bean注解比@Component注解更具可定制性,很多地方我们只能通过@Bean注解来注册bean。比如当我们引用第三方库中的类,需要将其组装到Spring容器中时,只能通过@Bean来实现。使用@Bean注解的例子:@ConfigurationpublicclassAppConfig{@BeanpublicTransferServicetransferService(){returnnewTransferServiceImpl();}}使用@Component注解的例子:@ComponentpublicclassServiceImplimplementsAService{....}下面的例子是通过@WhatComponent不能实现的:@BeanpublicOneServicegetService(status){case(status){when1:returnnewserviceImpl1();当2:returnnewserviceImpl2();当3:returnnewserviceImpl3();}}2。Autowire与@Resource的区别@Autowire和@Resource都可以用来组装bean,都可以用于字段或setter方法。@Autowire默认按类型组装。默认情况下,依赖对象必须存在。如果要允许空值,可以将其required属性设置为false。@Resource默认按名称连接,当找不到与名称匹配的bean时按类型连接。可以通过名称属性指定名称。如果不指定name属性,在字段上写注解时,使用默认的字段名。当注解写在setter方法上时,使用默认的属性名进行组装。注意:如果指定了name属性,则只会按name进行组装。@Autowire和@Qualifier的组合与@Resource的效果相同:@Autowired(required=false)@Qualifier("example")privateExample示例;@Resource(name="example")private示例示例;@Resource组装顺序如果同时指定了name和type,会从容器中寻找唯一匹配的bean组装,找不到则抛出异常;如果指定了name属性,则从容器中查找匹配名称的bean组件,如果找不到则抛出异常;type属性,从容器中寻找类型唯一匹配的beanassembly,如果找不到或者发现多个异常;如果不指定,则自动按照byName方法进行组装,如果不匹配,则回退到原来的类型进行匹配,如果匹配则自动装配。3.将类声明为Springbean的注解有哪些?@Component:一个通用注解,可以注解任何Spring组件。如果一个Bean不知道自己属于哪一层,可以用@Component注解来注解。@Repository:对应持久层,即Dao层,主要用于数据库相关操作。@Service:对应service层,主要设计一些复杂的逻辑,需要用到Dao层。@Controller:对应SpringMVC控制层,主要用于接受用户请求,调用Service层向前端页面返回数据。@Configuration:声明本类为配置类,可以在本类中声明一个或多个@Bean方法。4、@Configuration:配置类注解@Configuration表示在一个类中可以声明一个或多个@Bean方法,可以被Spring容器处理,在运行时为这些bean生成bean定义和服务请求,例如:@ConfigurationpublicclassAppConfig{@BeanpublicMyBeanmyBean(){//实例化、配置并返回bean...}}我们可以通过AnnotationConfigApplicationContext注册@Configuration类:AnnotationConfigApplicationContextctx=newAnnotationConfigApplicationContext();ctx.register(AppConfig.class);ctx.refresh();MyBeanmyBean=ctx.getBean(MyBean.class);//使用myBean...也可以通过组件扫描加载,@Configuration使用@Component进行原始注解,所以也可以扫描@Configuration类按组件(尤其是使用XML的元素)。@Configuration类不仅可以使用组件扫描进行引导,还可以使用@ComponentScan注解自行配置组件扫描:@Configuration@ComponentScan("com.acme.app.services")publicclassAppConfig{//各种@Beandefinitions...}Constraintsusing@Configuration:配置类必须作为类提供(例如,它不能是工厂方法返回的实例)。配置类必须是非最终的。配置类必须是非原生的(即不能在方法中声明),原生注解的方法。任何嵌套的配置类都必须声明为静态的。@Bean方法可能不会依次创建更多的配置类。除了单独使用@Configuration注解,我们还可以结合一些外部bean或注解使用,比如EnvironmentAPI、@PropertySource、@Value、@Profile等,这里不再详细介绍。更多用法请参考Spring@Configuration的相关文档。5、@ControllerAdvice:处理全局异常的利器Spring3.2新增了@ControllerAdvice、@RestControllerAdvice、@RestController注解,可用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,适用于所有@RequestMapping、@PostMapping、@GetMapping等这些Controller层的注解中。推荐一个SpringBoot基础教程和实例:https://github.com/javastacks...默认情况下,@ControllerAdvice中的方法会应用于全局所有的Controller。而是使用选择器annotations()、basePackageClasses()和basePackages()(或其别名value())来定义目标控制器的更窄子集。如果声明了多个选择器,则应用OR逻辑,这意味着所选控制器应至少匹配一个选择器。请注意,选择器检查是在运行时执行的,因此添加许多选择器会对性能产生负面影响并增加复杂性。@ControllerAdvice最常与@ExceptionHandler一起用于全局异常处理。结合下面的例子,我们可以捕获自定义异常进行处理并返回自定义状态码:@ControllerAdvice("com.developlee.errorhandle")publicclassMyExceptionHandler{/***捕获CustomException*@parame*@returnjson格式type*/@ResponseBody@ExceptionHandler({CustomException.class})//指定拦截异常的类型@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)//自定义浏览器返回状态码publicMap>String,Objectmap=newHashMap<>();map.put("code",e.getCode());map.put("msg",e.getMsg());returnmap;}}更多信息请参考Spring@ControllerAdvice的官方文档。6、@Component、@Repository、@Service的区别@Component是一个通用的Spring容器管理的单例bean组件。而@Repository、@Service、@Controller是针对不同使用场景采用的具体功能注解组件。因此,当你的某个类被@Component注解时,意味着它也可以被@Repository、@Service、@Controller替代,而且这些注解的作用会更多,而且作用各不相同。最后,如果你不知道在项目的业务层使用@Service注解还是@Component注解。那么,@Service是更好的选择。总结以上简单介绍了Spring中的几个注解和代码示例。个人认为一般都是用到且不易理解,或者是一些容易忽略的。当然,本文介绍的并不全面,后续会不断补充完善。近期热点文章推荐:1.1,000+Java面试题及答案(2021最新版)2.别在满屏的if/else中,试试策略模式,真的很好吃!!3.操!Java中xx≠null的新语法是什么?4、SpringBoot2.5发布,深色模式太炸了!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!