ApplicationContext
的三个非常有用的子类
BeanFactory
是Spring
容器的顶层接口,ApplicationContext
是它的子接口,它两个的区别:
-
ApplicationContext
读取配置文件就创建了对象 -
BeanFactory
使用到对象的时候才创建对象
ClassPathXmlApplicationContext
:从ClassPath
下加载配置文件
FileSystemXmlApplicationContext
:从文件系统中加载配置文件
AnnotationConfigApplicationContext
:使用注解的时候使用该类,他会读取Spring
的注解
bean标签中的属性
-
id
:对象的唯一标识 -
class
:类的全限定名 -
scope
:对象的作用范围singleton
:默认,单例prototype
:多例-
request
:request域 -
session
:session域 -
global session
:如果没有Portlet
环境相当于session
-
init-method
:该Bean被初始化的时候执行的方法的名称 -
destroy-method
:该Bean被销毁的时候执行的方法的名称
在单例的时候对象从加载到消亡全部都是Spring
容器决定的,在多例的时候,对象的死亡和容器销毁是没有关系的,Bean的销毁只和JVM
的垃圾回收有关。
实例化Bean的三种方式
方式一:使用构造方法来实例化,但是如果没有无参的构造,将会实例化失败
方式二:使用静态工厂来实例化对象,这个时候需要配置bean
标签中的id
,class
,factory-method
class
:指定静态工厂的类名factory-method
:指定静态工厂中的方法名
方式二:使用实例工厂来实例化对象,这个时候需要配置bean
标签中的id
,factory-bean
,factory-method
依赖注入的方式
通过构造函数注入,这个时候需要给bean
写一个子标签,constructor-arg
,属性解释:
-
index
:参数的位置 -
type
:参数的类型 -
name
:参数的名字 -
value
:参数的值 -
ref
:如果是复杂类型可以使用ref
进行引用
通过set方法注入,需要一个property
子标签,属性如下:
name
:属性的名字ref
:属性引用的类型value
:属性的值
使用p名称空间注入,需要在约束里面引入p名称空间
<beans ...
xmlns:p="http://www.springframework.org/schema/p"
...>
...
</beans>
使用的时候只需要p:属性名就可以了,涉及到复杂的类型p:属性名-ref
注入集合属性
数组、list、set,使用子标签array
、list
、set
,这些标签的子标签是标签value
,value
标签中写上值就可以了
properties、map,使用标签props
或者map
,其中props
标签和prop
搭配使用,map
和entry
标签配合使用
例如:
<!-- 在注入集合数据时,只要结构相同,标签可以互换 -->
<!-- 给数组注入数据 -->
<property name="...">
<set>
<value>...</value>
...
</set>
</property>
<!-- 注入 list 集合数据 -->
<property name="...">
<array>
<value>...</value>
...
</array>
</property>
<!-- 注入 set 集合数据 -->
<property name="...">
<list>
<value>...</value>
...
</list>
</property>
<!-- 注入 Map 数据 -->
<property name="...">
<props>
<prop key="...">...</prop>
...
</props>
</property>
<!-- 注入 properties 数据 -->
<property name="...">
<map>
<entry key="..." value="..."></entry>
<entry key="...">
<value>...</value>
</entry>
</map>
</property>
基于注解的Spring
使用注解前需要在配置文件中添加一行
<context:component-scan base-package="..."></context:component-scan>
用来创建对象的注解
@Component
注解,其中有一个value
值,可以规定Bean
的名称
类似的注解还有@Controller
,@Service
,@Repository
,这些注解都是用来将类实例化,然后放入容器中
用来注入数据的注解
如果使用注解来注入数据,那么set方法
可以不写
@Autowired
,不可以注入自己,首先根据类型匹配,如果匹配到了,就注入,如果匹配到多个类型,就会依照变量名到容器中找,找到了就注入,找不到就报错
@Qualifier
,他和@Autowired
一起使用,除非是参数注入它才可以单独存在,它可以指定要注入的bean
名称
@Resource
,相当于上面两个注解的结合体
@Value
,用来注入String
或者基本数据类型
用来改变作用域的注解
@Scope
,用来指定Bean
的作用域,作用域上面有介绍。
和声明周期相关的注解
@PostConstruct
:同init-method
@PreDestory
:同destroy-method
纯注解Spring
配置类
@Configuration
标注该类是配置类
@ComponentScan("包名")
用来扫描包
@Bean
用来将方法的返回值作为Bean
@PropertySource
可以将*.properties
文件中的的数据读取出来通过@Value
注解注入给属性
@Import
注解,如果项目中有好多的配置类,但是配置类上面不想写@Configuration
,这个时候可以使用@Import
注解来导入另一个配置类
补充,在主配置类中使用@ComponentScan(basePackages = "xxx")
将其他配置类扫描进来,这个时候其他配置类需要使用@Configuration
注解,如果主配置类中使用@Import
注解将其他配置类引入,其他配置类就可以不用使用@Configuration
注解了。
所有在AnnotationConfigApplicationContext
的参数中规定的类都可以不写@Configuration
结合Junit来测试Spring
测试类上加入@RunWith(SpringJUnit4ClassRunner.class)
还需要加入@ContextConfiguration(locations= {"classpath:bean.xml"})
其中@ContextConfiguration
注解中有两个属性locations
和classes
属性
locations
:指定配置文件的位置
classes
:如果不使用XML配置,使用此属性可以指定注解类的位置