1. ApplicationContext 接口的实现类
- ClassPathXmlApplicationContext:它是从类的根路径下加载配置文件(推荐使用)
- FileSystemXmlApplicationContext:它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。
- AnnotationConfigApplicationContext:当我们使用注解配置容器对象时,需要使用此类来创建spring 容器,它用来读取注解。
2. BeanFactory 和ApplicationContext 的区别
-
BeanFactory 才是Spring 容器中的顶层接口,ApplicationContext 是它的子接口。ApplicationContext包含BeanFactory的所有功能,除此还提供了更完整的框架功能:
-
继承MessageSource,因此支持国际化。
-
统一的资源文件访问方式。
-
提供在监听器中注册bean的事件。
-
同时加载多个配置文件。
通常建议优先使用ApplicationContext 。
-
-
创建对象的时机不一样:
- ApplicationContext:它在创建对象采取的策略是立即加载的方式,也就是说只要一读取配置文件,默认情况下就会创建对象。适用于单例对象。
- BeanFactory:它在创建核心容器时,创建对象采取的策略时延迟加载,也就是说,什么时候根据id获取对象了,什么时候才真正的创建对象。使用于多例对象。
3. sping创建对象的3种方式
- 使用默认构造函数创建。在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时。采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数,则对象无法创建。
<bean id="accountService" class="com.liuyh.service.impl.AccountServiceImpl"></bean>
- 使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器
<bean id="instanceFactory" class="com.liuyh.factory.InstanceFactory"></bean>
<bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"> </bean>
package com.liuyh.factory;
import com.liuyh.service.AccountService;
import com.liuyh.service.impl.AccountServiceImpl;
public class InstanceFactory {
public AccountService getAccountService(){
return new AccountServiceImpl();
}
}
- 使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring容器)
<bean id="accountService" class="com.liuyh.factory.StaticFactory" factory-method="getAccountService"></bean>
package com.liuyh.factory;
import com.liuyh.service.AccountService;
import com.liuyh.service.impl.AccountServiceImpl;
public class StaticFactory {
public static AccountService getAccountService(){
return new AccountServiceImpl();
}
}
4. bean的作用范围与生命周期
-
scope:指定对象的作用范围。
- singleton :默认值,单例的。一个应用只有一个对象的实例。它的作用范围就是整个引用。
- prototype :多例的。每次访问对象时,都会重新创建对象实例。
- request:WEB应用中,Spring创建一个Bean的对象,将对象存入到request域中。
- session:WEB应用中,Spring创建一个Bean的对象,将对象存入到session域中。
- global session:作用于集群环境中的会话范围(全局会话范围),当不是集群环境时,它就是session。
-
生命周期
- singleton生命周期
- 对象出生:当应用加载,创建容器时,对象就被创建了。
- 对象活着:只要容器在,对象一直活着。
- 对象死亡:当应用卸载,销毁容器时,对象就被销毁了。
- prototype生命周期
- 对象出生:当使用对象时,创建新的对象实例。
- 对象活着:只要对象在使用中,就一直活着。
- 对象死亡:当对象长时间不用时,被java的垃圾回收器回收了。
- singleton生命周期
5. 依赖注入实现方式
主要有两种实现方式,分别是属性 setter 注入和构造方法注入 。
6. spring常用注解
6.1 用于创建对象的注解
相当于:<bean id="" class="">
6.1.1 @Component
- 作用: 把资源让spring来管理。相当于在xml中配置一个bean。
- 属性: value:指定bean的id。如果不指定value属性,默认bean的id是当前类的类名,并且首字母小写。
6.1.2 @Controller @Service @Repository
这三个注解都是针对Component的衍生注解,作用及属性都是一模一样的,只不过是提供了更加明确的语义化。
- @Controller:一般用于表现层的注解。
- @Service:一般用于业务层的注解。
- @Repository:一般用于持久层的注解。
6.2 用于注入数据的注解
相当于:<property name="" ref=""> 或者<property name="" value="">
6.2.1 @Autowired
- 自动按照类型注入。
- 当使用此注解注入属性时,set方法可以省略。它只能注入其他bean类型。
- 当有多个类型匹配时,使用要注入的对象变量名称作为bean的id,在spring容器查找,找到了也可以注入成功,找不到就报错。
6.2.2 @Qualifier
- 作用: 在自动按照类型注入的基础之上,再按照Bean的id注入。它在给字段注入时不能独立使用,必须和@Autowire一起使用;但是给方法参数注入时,可以独立使用。
- 属性: value:指定bean的id。
6.2.3 @Resource
- 作用: 直接按照Bean的id注入,它也只能注入其他bean类型。
- 属性: name:指定bean的id。
6.2.4 @Value
- 作用: 注入基本数据类型和String类型数据的
- 属性: value:用于指定值
6.3 用于改变作用范围的注解
相当于:<bean id="" class="" scope="">
6.3.1 @Scope
- 作用: 指定bean的作用范围。
- 属性: value:指定范围的值。 取值:singleton prototype request session globalsession
6.4 和生命周期相关的注解
相当于:<bean id="" class="" init-method="" destroy-method="" />
6.4.1 @PostConstruct
- 作用: 用于指定初始化方法。
6.4.2 @PreDestroy
- 作用: 用于指定销毁方法。
6.5 配置类注解
6.5.1 @Configuration
- 作用: 用于指定当前类是一个spring配置类,当创建容器时会从该类上加载注解。获取容器时需要使用AnnotationApplicationContext(有@Configuration注解的类.class)。
- 属性: value:用于指定配置类的字节码
6.5.2 @ComponentScan
- 作用: 用于指定spring在初始化容器时要扫描的包。作用和在spring的xml配置文件中的: <context:component-scan base-package=""/>是一样的。
- 属性: basePackages:用于指定要扫描的包,和该注解中的value属性作用一样。
6.5.3 @PropertySource
- 作用:用于加载properties文件中的配置。例如我们配置数据源时,可以把连接数据库的信息写到properties配置文件中,就可以使用此注解指定properties配置文件的位置。
- 属性: value[]:用于指定properties文件位置。如果是在类路径下,需要写上classpath:
6.5.4 @Import
- 作用: 用于导入其他配置类,在引入其他配置类时,可以不用再写@Configuration注解,写上也没问题。
- 属性: value[]:用于指定其他配置类的字节码。
6.6 用于方法上的注解
6.6.1 @Bean
- 作用: 该注解只能写在方法上,表明使用此方法创建一个对象,并且放入spring容器。
- 属性: name:给当前@Bean注解方法创建的对象指定一个名称(即bean的id)。