Spring IoC容器
1.思想
bean对象的创建、依赖关系交给Ioc容器来管理,无需手动new对象,方便解耦,便于开发。
2.IoC容器
Spring容器的最顶层接口是BeanFactory,实际开发中常用ApplicationContext。
两个接口的区别:
ApplicationContext:立即加载。读取配置文件后马上创建对象放入容器。BeanFactory:延迟加载。什么时候根据id获取对象,什么时候才真正创建对象。
ApplicationContext的三个常用实现类
ClassPathApplicationContext:加载类路径下的配置文件。FileSystemXmlApplicationContext:加载磁盘任意路径下的配置文件。AnnotationConfigApplicationContext:读取注解 创建容器。
3.Bean
1.创建bean的三种方式
- 使用默认的无参构造器(如果没有无参构造器,则报错)
- 使用静态工厂的静态方法创建对象
- 使用实例工厂的方法创建对象
2.bean对象的生命周期
- 单例
- 出生:当容器创建时对象出生
- 活着:只要容器还在,对象一直活着
- 死亡:容器销毁,对象消亡
- 总结:单例对象的生命周期与容器相同
- 多例
- 出生:使用对象时才创建(延迟加载)
- 活着:对象只要在使用过程中就一直活着
- 死亡:当对象长时间不用且无其他对象引用时,由
GC回收
3.依赖注入
依赖关系的管理交给Spring来维护在当前类需要用到其他类的对象时,由Spring为我们提供,只需在配置文件中说明。
依赖注入的数据有三类:
- 基本类型和
String - 其他
bean类型(在配置文件中或注解中配置过的bean) - 复杂类型(集合类型)
注入的方式有三种:
- 使用构造方法
- 使用
set方法 - 使用注解
4.常用注解
- 用于创建对象的注解(作用类似于
bean标签)
@Component
作用:写在类之前,把当前类的对象注入到容器中
属性:value 指定bean的id 默认值是当前类名首字母改为小写
@Controller:一般用在表现层@Serive:一般用在业务层@Repository:一般用在持久层以上三个注解的作用与属性和
Component一样,
他们三个是Spring框架提供的明确的三层使用的注解,使三层对象更加清晰。
- 用于注入数据的注解(作用相当于
properties标签)
@Autowired:作用:自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功
使用的位置:变量上或方法上
注意:如果容器中没有任何bean的类型匹配,则报错。
如果容器中有多个bean的类型和要注入的变量类型匹配,如果要注入的变量名称和bean的id相匹配,则注入之,否则报错。
另外,使用注解的方法注入时,set方法不是必须的@Qualifier作用:在按照类中注入的基础上再按名称注入。
注意:它给类成员注入时不能单独使用,必须和
Autowired配合使用,但是在给方法参数注入时可以单独使用。属性:
value用于指定注入bean的id@Resource作用:直接按照
bean的id注入,可以独立使用,不需要再和Autowired一起使用属性:name 用于指定注入
bean的id注意:以上三个注解只能注入其他
bean类型的数据,而基本类型和String类型无法使用上述注解
另外,集合类型注入只能使用xml
@Value作用:用于注入基本类型和
String类型的数据属性:
value:用于指定数据的值它可以使用
Spring中的SpEL。SpEL写法:${表达式}
- 一些和配置有关的注解
可以使用配置类以代替
bean.xml配置文件的作用@Configuration作用:指定当前类是一个配置类
细节:当配置类作为
AnnotationConfigApplicationContext对象创建的参数时,可以不写。@ComponentScan作用:指定创建容器时要扫描的包
@Bean作用:用在方法前,将方法的返回值作为
bean对象存入IoC容器属性:
name用于指定bean的id默认值为当前方法名细节:使用注解配置方法时,如果方法有参数,
Spring框架会去容器中查找是否有该类型的bean,查找方式和Autowired相同@Import作用:用于导入其他配置类
属性:
value用于指定其他配置类的字节码@PropertySource作用:用于指定properties文件的位置
属性:
value指定文件名称和路径
关键字classpath表示类路径下