spring配置文件 applicationContext.xml

最近在学习spring框架,由于对于配置文件的陌生和恐惧,遂将遇到的 xml 属性都记录下来,起到 积累 和 以便复习 自用。

1.引用约束

<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入约束 -->
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:p="http://www.springframework.org/schema/p"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- 将所需要的bean写到这里,被beans包裹着 -->
	
</beans> 


为什么要引入约束?

引入约束的目的是为了方便提示你一些东西。比如我输入   be , 然后按下 <alt +/>组合键,它会自动弹出 bean 或 beans供你选择。

2.bean 实例化的三种方式

	<!-- Bean产生的三种方式 -->
	<!-- 第一种:无参构造器 -->
	<bean id="bean1" class="com.bzc.www.a_instance.Bean1"></bean>
	<!-- 工厂静态方法实例化bean -->
	<bean id="bean2" class="com.bzc.www.a_instance.BeanFactory01" factory-method="getBean2"></bean> 
	<!-- 工厂bean实例化需要的bean -->
	<bean id="bean3Factory" class="com.bzc.www.a_instance.BeanFactory2"></bean>
	<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean> 

bean实例化,简单的理解就是 通过 spring 容器我要获得一个对象,这时候在xml里应该怎么配置?如上有三种方式,在此不做一一详解,通常最常用的是第一种无参构造。

也就是你需要创建的那个类里只要拥有一个无参构造器即可,id是自定义的,可以随便取,但要符合java命名规范,class是类的完整路径名

3.id 和 name 的区别

	<!-- 验证id和name的区别 -->
	<bean name="/iamname" class="com.bzc.www.b_scope.IdAndName"></bean>
区别:
 1)id 只能唯一,而 name 可以不唯一;
 2)当只有name没有id时,name可等同于id;
 3)name的命名规则没有限制,而id得按照标准来:由字母数字和下划线组成,且第一个字符必须是字母。
这里的 name 属性包含了一个斜扛  用id就会报错。

4.scope 的作用
	<!-- 验证多例模式 -->
	<bean id="product" class="com.bzc.www.b_scope.Product" scope="prototype"></bean>
scope总共有以下几个属性:
通用:singleton(默认属性,单例模式)、prototype(多例模式)
用于web工程里:request、session、globalsession

单例模式和多例模式的区别:在一个方法里创建一个 bean 的对象,如果是单例模式,前后通过 getBean 获得的对象是同一个对象,前后操作互相影响。但如果是多例模式,通过 getBean 获得的对象不是同一个对象,前后操作互不影响。

5.spring bean的三种注入方式
1)构造器注入
	<!-- 构造器注入 -->
	<bean id="student" class="com.bzc.www.c_injection.Student">
		<constructor-arg index="0" type="java.lang.String" value="张三"></constructor-arg>
		<constructor-arg index="1" type="java.lang.Integer" value="14"></constructor-arg>
	</bean>
注:构造方法为public Student(String name,Integer age){this.name=name;this.age=age}
构造方法里的参数必须都要注入,如果这里只注入name而不注入age就会报错。原因,找不到对应的构造器。
2)setter方法注入:注入的属性添加对应的setter方法
<span style="white-space:pre">	</span><!-- setter 方法注入 -->
	<bean id="classes" class="com.bzc.www.c_injection.Classes">
		<property name="name" value="终极一班"></property>
		<property name="number" value="42"></property>
	</bean>
3)复杂对象的 注入    ref属性的使用
	<!-- 复杂对象的注入    ref的使用 -->
	<bean id="teacher" class="com.bzc.www.c_injection.Teacher">
		<property name="name" value="李四"></property>
		<property name="age" value="34"></property>
		<property name="classes" ref="classes"></property>
	</bean>
条件:Teacher类中有个属性classes,数据类型是Classes,在这里由于是复杂类型,不能直接用value赋值,而是通过 ref 关联到前面已经注入过classes的那个bean

6.p名称空间  
xmlns:p="http://www.springframework.org/schema/p"    //如果要使用名称空间,要检查约束里可有这条,没有的话自行添加
作用:第5点提到了属性注入,如果属性很多,要写很多个<property></property>,会很繁琐,为了简化这一操作,就可以使用p名称空间。
如:将第5点里的第3小点  复杂对象的注入  用p名称空间转写如下:
<span style="white-space:pre">	</span><!-- p名称空间的使用 : 简化property的使用 -->
	<bean id="teacher" class="com.bzc.www.c_injection.Teacher" p:name="王五" p:age="23" p:classes-ref="classes"/>
注:p:属性=“属性值”       如果是复杂对象,要引用其他bean,格式为   p:属性名-ref="要引用的那个bean的名称"

7.SpEL表达式
使用这个表达式是为了使注入变得更加灵活,可以引用别的bean里的数据来注入自己bean的属性,这里只粗略介绍下用法。
有个数据bean      类的代码如下:
public class UserInfo {
	public String getName() {
		return "钱六";
	}

	public Integer calcu(){
		return 16;
	}
}
现在就从这个数据源里引用数据来填充自己bean的属性。同样将第5点的第3小点  复杂对象的注入   改写如下:
	<!-- SpEl表达式的使用 -->
	<bean id="userInfo" class="com.bzc.www.c_injection.UserInfo"></bean> <!-- 提供数据的那个bean -->
	<bean id="teacher" class="com.bzc.www.c_injection.Teacher">
		<property name="name" value="#{userInfo.name}"></property><!-- 使用数据bean的里的属性,这里的name不是属性,是getName -->
		<property name="age" value="#{userInfo.calcu()}"></property><!-- 使用数据bean里的方法 -->
		<property name="classes" value="#{classes}"></property><!-- 使用其他bean -->
	</bean>

8.集合bean的写法
这部分知识没有技术含量,要使用过的时候直接复制粘贴格式即可,然后自行修改需要的数据。
	<!-- 集合的配置 -->
	<bean id="people" class="com.bzc.www.c_injection.People">
		<!-- Set集合   value值不能一样,否则会报错 -->
		<property name="hobbies">
			<set>
				<!-- <ref/>用于泛型为复杂对象时,<value>用于泛型为基本类型时 -->
				<value>打篮球</value>
				<value>唱歌</value>
			</set>
		</property>
		<!-- List集合   数组的配法与List集合一样-->
		<property name="sports">
			<list>
				<!-- 复杂类型时使用 : <ref/> -->
				<value>羽毛球</value>
				<value>乒乓球</value>
			</list>
		</property>
		<!-- Map集合   -->
		<property name="identity">
			<map>
				<!--  复杂类型时使用 : <entry key-ref="" value-ref=""></entry> -->
				<entry key="中年人" value="老师"></entry>
				<entry key="青年人" value="学生"></entry>
			</map>
		</property>
		<!-- Properties集合  与map类型,但先放进去的数据会后取出来-->
		<property name="pNum">
			<props>
				<prop key="1">一</prop>
				<prop key="2">二</prop>
			</props>
		</property>
	</bean>

9.引用其他的bean.xml文件
当一个工程越来越大时,所有的bean都写在一个application.xml时会显得很拥挤,不利于后期的维护和管理。
可以采取将关系相近的bean配置到一个单独的xml中,如bean1.xml,再将bean1.xml引入到applicationContext.xml中即可。
	<import resource="classpath:Bean1.xml"/> 
其中的classpath:  表示在src目录下。

10.使用注解 在xml里的配置
 * 受限需要引入相应的约束
	   xmlns:context="http://www.springframework.org/schema/context" 
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
 * 然后配置扫描包,要让spring找到哪些包下面的类使用了注解
	<!-- 启用自动注解,使@Resource、@PostConstruct、@PreDestory、@Autowired四个注解生效 -->
	<context:annotation-config/>
	<!-- spring去扫描这些包,才能找到哪些类使用了注解 -->
	<context:component-scan base-package="com.bzc.www"></context:component-scan> 
工程中有很多包,如:
    com.bzc.www.controller
    com.bzc.www.service
    com.bzc.www.persistence
在扫描包的时候只要写     com.bzc.www    即可全部扫描到
一般启用自动注解和扫描包两个都写上。

11.xml 配置bean的初始化方法和销毁方法
	<bean id="userService" class="com.bzc.www.d_spring2annotation.UserService" init-method="setup" destroy-method="destory"/>
注意:1.sestup和destory都是类中定义的方法;
2.销毁方法只能对单例Bean起作用;
3.销毁方法必须得关闭applicationContext对象,如applicationContext.close();而且这个applicationContext对象是用ApplicationContext的子类ClassPathXmlApplicationContext类来创建的。






  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值