Spring配置
1. 通过xml文件进行配置
一般Spring配置文件的名字为applicationContext.xml
。
通过xml文件启动Spring:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
1.1. 别名
如果添加了别名,我们也可以使用别名获取到这个对象
值得注意的是,使用别名后,原有名字并不会失效
<alias name="fromName" alias="toName"/>
1.2. bean
id:bean的唯一标识符
class:bean对象所对应的全限定名:包名+类名
name:也是别名,而且name可以同时取多个别名,同时支持不同的分隔符
scope:默认为单例模式,即singleton。prototype为多实例模式。
autowire:实现自动装配
<bean id="someClass" class="com.gs.dao.SomeClass" name="n1 n2,n3;n4">
</bean>
bean的作用域
Scope | Description |
---|---|
singleton | (默认)将每个 Spring IoC 容器的单个 bean 定义范围限定为单个对象实例。 |
prototype | 将单个 bean 定义的作用域限定为任意数量的对象实例。 |
request | 将单个 bean 定义的范围限定为单个 HTTP 请求的生命周期。也就是说,每个 HTTP 请求都有一个在单个 bean 定义后面创建的 bean 实例。仅在可感知网络的 Spring ApplicationContext 中有效。 |
session | 将单个 bean 定义的范围限定为 HTTP Session 的生命周期。仅在可感知网络的 Spring ApplicationContext 上下文中有效。 |
application | 将单个 bean 定义的范围限定为ServletContext 的生命周期。仅在可感知网络的 Spring ApplicationContext 上下文中有效。 |
websocket | 将单个 bean 定义的范围限定为WebSocket 的生命周期。仅在可感知网络的 Spring ApplicationContext 上下文中有效。 |
其中,后四种都在web开发中才需要用到。
scope:默认为单例模式,即singleton(可以不显式定义)。每次调用get获取对象的时候都会返回相同的实例。(多线程并发问题)
<bean id="someClass" class="com.gs.dao.SomeClass" scope="singleton" />
prototype为多实例模式。每次调用get获取对象的时候都会得到一个新的实例。(资源占用问题)
<bean id="someClass" class="com.gs.dao.SomeClass" scope="prototype" />
autowire自动装配
byName自动装配
byName会自动在容器的上下文中进行查找和自己对象set方法后面的值相对应的bean的id或者name。
<bean id="someClass" class="com.gs.dao.SomeClass" autowire="byName" />
注意点:需要保证要注入的bean的id或者name需要和注入的属性的set方法后面的值一致。
byType自动装配
byType会自动在容器的上下文中进行查找和自己对象属性类型相同的beanid。
<bean id="someClass" class="com.gs.dao.SomeClass" autowire="byType" />
注意点:需要保证要注入的bean的class唯一,并且这个class需要和注入的属性的类型一致。
1.3. import
import,一般用于团队开发使用,可以将多个配置文件,导入合并为一个。
利用import将不同的xml配置文件合并为一个总的。
在使用的时候,直接导入总的配置到程序中就可以了。
<beans>
<import resource="services.xml"/>
<import resource="resources/messageSource.xml"/>
<import resource="/resources/themeSource.xml"/>
<bean id="bean1" class="..."/>
<bean id="bean2" class="..."/>
</beans>
2. 通过Java文件进行配置
通过Java文件启动Spring:
ApplicationContext context = new AnnotationConfigApplicationContext(myConfig.class);
JavaConfig是Spring的一个子项目,在Spring4之后成为一个核心功能。
通过Java文件配置,可以完全不使用xml配置,全权交给Java来做。
配置文件
package org.gs.config; import org.gs.pojo.User; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; // @Configuration 自身就是一个Component,因此会被Spring托管 // @Configuration 代表这是一个配置类,就和之前applicationContext.xml一样 // @Import 可以导入其他配置文件,类似于上文的import标签 // @ComponentScan(value) 可以开启通过包名扫描注解 @Configuration @Import(myConfig2.class) public class myConfig { // 相当于通过bean标签注册bean到Spring中 // 方法名相当于这个bean的id // 方法的返回值就是这个bean的类型 @Bean public User getUser(){ return new User();//就是返回要注入到bean的对象 } }
组件
在实体类的类名添加@Component,类会被Spring接管并注册到容器中。
//这里这个注解的意思,就是说明这个类被Spring接管,注册到了容器中 @Component public class User { }
获取组件
ApplicationContext context = new AnnotationConfigApplicationContext(myConfig.class); User getUser = (User) context.getBean("getUser");