ApplicationContext

转载自 //blog.csdn.net/baidu_32262373/article/details/51694100

1.引用约束

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!-- 引入约束 -->  
  3. <beans xmlns="http://www.springframework.org/schema/beans"  
  4.        xmlns:p="http://www.springframework.org/schema/p"  
  5.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  6.        xsi:schemaLocation="  
  7. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  
  8.     <!-- 将所需要的bean写到这里,被beans包裹着 -->  
  9.       
  10. </beans>   


为什么要引入约束?

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

2.bean 实例化的三种方式

[html]  view plain  copy
  1. <!-- Bean产生的三种方式 -->  
  2. <!-- 第一种:无参构造器 -->  
  3. <bean id="bean1" class="com.bzc.www.a_instance.Bean1"></bean>  
  4. <!-- 工厂静态方法实例化bean -->  
  5. <bean id="bean2" class="com.bzc.www.a_instance.BeanFactory01" factory-method="getBean2"></bean>   
  6. <!-- 工厂bean实例化需要的bean -->  
  7. <bean id="bean3Factory" class="com.bzc.www.a_instance.BeanFactory2"></bean>  
  8. <bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>   

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

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

3.id 和 name 的区别

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

6.p名称空间  
[html]  view plain  copy
  1. xmlns:p="http://www.springframework.org/schema/p"    //如果要使用名称空间,要检查约束里可有这条,没有的话自行添加  
作用:第5点提到了属性注入,如果属性很多,要写很多个<property></property>,会很繁琐,为了简化这一操作,就可以使用p名称空间。
如:将第5点里的第3小点  复杂对象的注入  用p名称空间转写如下:
[html]  view plain  copy
  1. <span style="white-space:pre">    </span><!-- p名称空间的使用 : 简化property的使用 -->  
  2.     <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      类的代码如下:
[java]  view plain  copy
  1. public class UserInfo {  
  2.     public String getName() {  
  3.         return "钱六";  
  4.     }  
  5.   
  6.     public Integer calcu(){  
  7.         return 16;  
  8.     }  
  9. }  
现在就从这个数据源里引用数据来填充自己bean的属性。同样将第5点的第3小点  复杂对象的注入   改写如下:
[html]  view plain  copy
  1. <!-- SpEl表达式的使用 -->  
  2. <bean id="userInfo" class="com.bzc.www.c_injection.UserInfo"></bean> <!-- 提供数据的那个bean -->  
  3. <bean id="teacher" class="com.bzc.www.c_injection.Teacher">  
  4.     <property name="name" value="#{userInfo.name}"></property><!-- 使用数据bean的里的属性,这里的name不是属性,是getName -->  
  5.     <property name="age" value="#{userInfo.calcu()}"></property><!-- 使用数据bean里的方法 -->  
  6.     <property name="classes" value="#{classes}"></property><!-- 使用其他bean -->  
  7. </bean>  

8.集合bean的写法
这部分知识没有技术含量,要使用过的时候直接复制粘贴格式即可,然后自行修改需要的数据。
[html]  view plain  copy
  1. <!-- 集合的配置 -->  
  2. <bean id="people" class="com.bzc.www.c_injection.People">  
  3.     <!-- Set集合   value值不能一样,否则会报错 -->  
  4.     <property name="hobbies">  
  5.         <set>  
  6.             <!-- <ref/>用于泛型为复杂对象时,<value>用于泛型为基本类型时 -->  
  7.             <value>打篮球</value>  
  8.             <value>唱歌</value>  
  9.         </set>  
  10.     </property>  
  11.     <!-- List集合   数组的配法与List集合一样-->  
  12.     <property name="sports">  
  13.         <list>  
  14.             <!-- 复杂类型时使用 : <ref/> -->  
  15.             <value>羽毛球</value>  
  16.             <value>乒乓球</value>  
  17.         </list>  
  18.     </property>  
  19.     <!-- Map集合   -->  
  20.     <property name="identity">  
  21.         <map>  
  22.             <!--  复杂类型时使用 : <entry key-ref="" value-ref=""></entry> -->  
  23.             <entry key="中年人" value="老师"></entry>  
  24.             <entry key="青年人" value="学生"></entry>  
  25.         </map>  
  26.     </property>  
  27.     <!-- Properties集合  与map类型,但先放进去的数据会后取出来-->  
  28.     <property name="pNum">  
  29.         <props>  
  30.             <prop key="1"></prop>  
  31.             <prop key="2"></prop>  
  32.         </props>  
  33.     </property>  
  34. </bean>  

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

10.使用注解 在xml里的配置
 * 受限需要引入相应的约束
[html]  view plain  copy
  1. xmlns:context="http://www.springframework.org/schema/context"   
[html]  view plain  copy
  1. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd  
 * 然后配置扫描包,要让spring找到哪些包下面的类使用了注解
[html]  view plain  copy
  1. <!-- 启用自动注解,使@Resource、@PostConstruct、@PreDestory、@Autowired四个注解生效 -->  
  2. <context:annotation-config/>  
  3. <!-- spring去扫描这些包,才能找到哪些类使用了注解 -->  
  4. <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的初始化方法和销毁方法
[html]  view plain  copy
  1. <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类来创建的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值