当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)}">
答案 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
,则应将其命名为DatatablesCriteriasRepositoryImpl
。 UserRepsitoryImpl
扩展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。