spring bean的bean ID是什么实现了一个接口

时间:2015-04-05 13:33:28

标签: java spring spring-mvc thymeleaf

当bean为类创建为MyBean时,bean id为myBean如果我从下面的接口创建服务bean,那么bean ID是什么?

@Service
public class ProfileServiceImpl implements ProfileService

当我尝试以@profileService访问bean时,thymeleaf会给出以下错误。

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'profileService' is defined

这一次我通过autowiring将这个bean用于控制器。但目前我需要从thymeleaf

访问此内容

我的百万美元代码段

 <div th:unless="${@profileService.isMe(user)}">

2 个答案:

答案 0 :(得分:2)

当Spring从@Service或@Component批注创建Bean定义时,它默认通过小写类名的第一个字母为bean创建一个id。如果要覆盖该行为,可以在注释中提供替代ID,例如。 @Service( “profileService”)。

关于您使用存储库遇到的问题 - 默认情况下,Spring通过将“Impl”附加到存储库接口名称来查找存储库的自定义实现。如果找到它,它将不会创建默认实现。所以,如果你有UserRepositoryImpl extends UserRepository而不是UserRepositoryImpl extends DatatablesCriteriasRepository,那么Spring就不会创建userRepository bean。另外,如果向@NoRepositoryBean接口添加UserRepository注释,则会禁止创建userRepository bean。

但是,UserRepositoryImpl确实应该实施UserRepository。如果确实要扩展DatatablesCriteriasRepository,则应将其命名为DatatablesCriteriasRepositoryImplUserRepsitoryImpl扩展DatatablesCriteriasRepository表示设计存在问题。

答案 1 :(得分:0)

for (String name : context.getBeanDefinitionNames()){
    System.out.println(name);
}

这项测试揭示了一些有趣的结果。

服务bean

服务bean以具体类名命名,无论接口如何。

@Service
public class ProfileServiceImpl implements ProfileService

即。 profileServiceImpl在上述问题中。

存储库bean

进一步的存储库bean更有趣。下面是我的crud存储库接口,没有任何注释。

public interface UserRepository extends CrudRepository<User, Long>, DatatablesCriteriasRepository<User>{

我为UserRepositoryImpl创建了DatatablesCriteriasRepository的实现,如下所示,没有任何注释。

public class UserRepositoryImpl implements DatatablesCriteriasRepository<User>

这两个包含两个ID分别为userRepository userRepositoryImpl的bean。