一.Bean
概念:
被Spring IOC所管理的对象
创建方式:
1.通过xml配置<bean>标签
2.通过@Component注解
二.@Component注解
表示要被IOC所管理(放在类上,类名开头变成小写是bean的name)
衍生注解(本质上也是@Component注解)
@Configuration:配置类代替xml配置文件
@Service:Spring MVC中使用,表示该类是服务层
@Repository:Spring MVC中使用,表示该类是持久层
三.@Bean注解
功能和@Component一样,表示要被IOC所管理,但使用方式不同
使用方式:
1.在@Configuration配置类中使用
2.@Bean要放在方法上(方法名就是bean的name)
@Component必须写在类上,如果是第三方包我们无法在类上添加该注解,无法自定义初始化过程
在@Configuration下的@Bean方法,返回对象就是ioc所管理的对象,默认情况下多次调用方法都返回同一对象
注意事项:
1.只有被ioc所管理的对象才能参数自动装配
2.参数装配与bean的声明顺序无关,spring会解析依赖关系,自己控制顺序
拓展:
在同一配置类顺序无所谓
在不同配置类顺序也无所谓
四.构造Bean调用哪个构造方法?
@Component/@Import:
1.有默认构造就调用默认构造
2.只有一个有参构造,调用该有参构造,并且参数装配
3.多个有参构造并且没有无参构造,会报错
@Bean:
可以在方法里自由选择构造
// 使用@Component就是构造的参数注入
// 使用@Bean就是@Bean方法的参数注入
五.@Order/实现Ordered接口
当有多个同类型的bean,用List接收时,通过@Order注解改变bean在List中的位置,值越小优先级越高
六.@Lazy
普通bean在ioc加载时已经创建,加上@Lazy的bean只有在使用时(自动注入/getBean)才创建
懒加载可以提高Spring应用启动速度,项目中bean会非常多,如果都在启动时创建很耗时,使用时再创建更合理
七.@Scope
设置bean的作用域,有两种类型singleton(单例)/prototype(多例)
通常单例更加节省内存,但是有些业务就是符合多例情况,如每辆汽车都要一个发动机,这时发动机就不能单例