今天碰到了三者共同使用,产生了一系列问题,下面将进行错误复原和分析,避免大家踩坑。
复习
Spring实例化bean有四种方式
1.无参构造方法实例化(Spring默认,常用,需要bean类中存在无参构造方法);
2.静态工厂实例化
3.实例化工厂实例化
4.注解方式实例化
spring依赖注入的三种方式
1.使用setter方法
2.使用有参构造器
3.使用注解@Bean、@Autowired
1.项目准备
项目结果:
问题1:
ViewServiceImpl类更改为
结果:
问题2:
ViewServiceImpl类更改为
结果出现错误
java.lang.IllegalStateException: Failed to load ApplicationContext(java.lang.IllegalStateException:无法加载 ApplicationContext)。
No qualifying bean of type ‘java.lang.Integer’ available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}(没有可用的“java.lang.Integer”类型的合格 bean:预计至少有 1 个有资格作为自动装配候选者的 bean。依赖注释:{})
解决方法1:不可行
改为
但是也会出现上述错误。
解决方法2:可行
ViewServiceImpl类更改为
结果
解决方法3:可行
或者
上述对testService字段的修改,完全也可以加上@Autowired标签
结果与上述相同。
注意不可对filed字段进行上述的修改,否者还会出现上述bean注入错误信息。
解决方法4:可行,推荐,项目中经常使用
结果正确。
学习
@Value注入外部属性的三种方式
-
注入普通属性
2.注入配置文件
可以通过@Value(“${}”)来注入配置文件里面的信息
3. 注入表达式并运算
构造器注解解释
@AllArgsConstructor 注解在类上,为类提供一个全参的构造方法
@NoArgsConstructor 注解在类上,为类提供一个无参的构造方法。
@RequiredArgsConstructor 注解在类上,会生成构造方法(可能带参数也可能不带参数)。
注意:@RequiredArgsConstructor如果带参数,这参数只能是以 final 修饰的未经初始化的字段或者是以 @NonNull 注解的未经初始化的字段
注意:
每个类默认有个无参构造方法,但是重载了其默认的构造方法。重载之后 默认的构造方法就会被覆盖。