Spring的@Bean注解和@Component注解有什么区别? [英] what is the difference between @Bean annotation and @Component annotation at Spring?
问题描述
这对你来说可能是一个非常简单的问题.但我读了很多文档,我完全糊涂了.我们可以使用@Component 代替@Bean 或@Bean 代替@Component(以及@Repository @Service @控制器)?
干杯
组件
@Component
也用于 @Service
和 @Repository
用于使用类路径扫描自动检测和自动配置 bean.>
只要这些类在我们的基础包下或者 Spring 知道另一个要扫描的包,就会为这些类中的每一个创建一个新的 bean
Bean 和 Component 一对一映射,即每个类一个 bean.
这些注解(@Component、@Service、@Repository
)是类级别的注解.
示例:
假设我们有一个 UserService 类,其中包含用户操作的所有方法.
@Service公共类用户服务{@自动连线私有 UserRepository userRepository;@覆盖公共用户 findByUsername( String username ) 抛出 UsernameNotFoundException {用户 u = userRepository.findByUsername( 用户名);返回你;}公共列表<用户>findAll() 抛出 AccessDeniedException {列出<用户>结果 = userRepository.findAll();返回结果;}}
Spring 将为 UserService 创建一个 Bean,我们可以在多个位置/类中使用它.
@Bean
@Bean
用于声明单个 bean,而不是像 Component 那样让 Spring 自动完成.
它将 bean 的声明与类定义分离,让您可以完全按照自己的选择创建和配置 bean.
@Bean 用于方法级别,可以根据需要进行配置
例如:
@Configuration@启用网络安全@EnableGlobalMethodSecurity(prePostEnabled = true)公共类 WebSecurityConfig 扩展了 WebSecurityConfigurerAdapter {@豆公共 SpringTemplateEngine springTemplateEngine(){SpringTemplateEngine templateEngine = new SpringTemplateEngine();templateEngine.addTemplateResolver(htmlTemplateResolver());返回模板引擎;}@豆公共 SpringResourceTemplateResolver htmlTemplateResolver(){SpringResourceTemplateResolver emailTemplateResolver = new SpringResourceTemplateResolver();emailTemplateResolver.setPrefix("classpath:/static/template/");emailTemplateResolver.setSuffix(.html");emailTemplateResolver.setTemplateMode(HTML");emailTemplateResolver.setCharacterEncoding(StandardCharsets.UTF_8.name());返回 emailTemplateResolver;}...
在此处阅读有关定型注释的更多信息.
It might be a very simple question for you.But I read lots of documents and I am totally confused.We can use @Component instead of @Bean or @Bean instead of @Component(as well as @Repository @Service @Controller) ?
Cheers
Component
@Component
also for @Service
and @Repository
are used to auto-detect and auto-configure beans using classpath scanning.
As long as these classes are in under our base package or Spring is aware of another package to scan, a new bean will be created for each of these classes
Bean and Component are mapped as one to one i.e one bean per Class.
These annotations (@Component, @Service, @Repository
) are Class level annotations.
Example:
Lets Say we have a UserService Class which contains all methods for User Operation.
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Override
public User findByUsername( String username ) throws UsernameNotFoundException {
User u = userRepository.findByUsername( username );
return u;
}
public List<User> findAll() throws AccessDeniedException {
List<User> result = userRepository.findAll();
return result;
}
}
Spring will create a Bean for UserService and we can use this at multiple location/classes.
@Bean
@Bean
is used to declare a single bean, rather than letting Spring do it automatically as in case of Component.
It decouples the declaration of the bean from the class definition, and lets you create and configure beans exactly how you choose.
@Bean are used at method level and can be configured as required
eg:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public SpringTemplateEngine springTemplateEngine()
{
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.addTemplateResolver(htmlTemplateResolver());
return templateEngine;
}
@Bean
public SpringResourceTemplateResolver htmlTemplateResolver()
{
SpringResourceTemplateResolver emailTemplateResolver = new SpringResourceTemplateResolver();
emailTemplateResolver.setPrefix("classpath:/static/template/");
emailTemplateResolver.setSuffix(".html");
emailTemplateResolver.setTemplateMode("HTML");
emailTemplateResolver.setCharacterEncoding(StandardCharsets.UTF_8.name());
return emailTemplateResolver;
}
...
Read more about Stereotype Annotations here.
这篇关于Spring的@Bean注解和@Component注解有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!