spring配置文件 applicationContext.xml

时间:2022-12-16 17:21:24

最近在学习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类来创建的。