对您来说这可能是一个非常简单的问题,但是我阅读了很多文档并且感到非常困惑。我们可以使用@Component代替@Bean或@Bean代替@Component(以及@Repository @Service @控制器)?
欢呼声
答案 0 :(得分:4)
组件
@Component
也用于@Service
和@Repository
,使用类路径扫描来自动检测和自动配置bean。
只要这些类在我们的基本程序包中,或者Spring知道要扫描的另一个程序包,就会为每个这些类创建一个新的Bean
Bean和Component一对一映射,即每个类一个bean。
这些注释(@Component, @Service, @Repository
)是类级别的注释。
示例:
假设我们有一个UserService类,其中包含用于用户操作的所有方法。
@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将为UserService创建一个Bean,我们可以在多个位置/类中使用它。
@Bean
@Bean
用于声明单个bean,而不是像Component那样让Spring自动执行。
它使Bean的声明与类定义脱钩,使您可以完全按照自己的选择创建和配置Bean。
@Bean在方法级别使用,可以根据需要进行配置
例如:
@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;
}
...
答案 1 :(得分:0)
ini_set('display_errors', 1);
用于将方法定义为生产方,它告诉@Bean
使用该方法检索方法返回类型的对象,并在需要时将其作为依赖项注入。 / p>
Spring
用于将类定义为@Component
组件,它告诉Spring
从中创建对象(如果是Singleton)并处理其生命周期和依赖关系并注入该对象在任何需要的时间。
Spring
和@Service
基本上就像@Component和AFAIK一样,只是为了更好地对组件进行分组。
@Repository
用于定义具有业务逻辑的服务类,而@Service
用于定义与诸如数据库之类的基础系统交互的存储库类。