最近在学习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得按照标准来:由字母数字和下划线组成,且第一个字符必须是字母。
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>
这部分知识没有技术含量,要使用过的时候直接复制粘贴格式即可,然后自行修改需要的数据。
<!-- 集合的配置 --> <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类来创建的。
3.销毁方法必须得关闭applicationContext对象,如applicationContext.close();而且这个applicationContext对象是用ApplicationContext的子类ClassPathXmlApplicationContext类来创建的。