Core模块主要的功能是实现了控制反转与依赖注入、Bean配置以及加载。Core模块中有Beans、BeanFactory、BeanDefinitions、ApplicationContext等概念。Beans为spring里的各种对象,一般要配置在spring的配置文件中;BeanFactory为创建Beans的Factory,spring通过BeanFactory加载各种Beans;BeanDefinition为Bean在配置文件中的定义,一般要定义id和class;ApplicationContext代表配置文件。

BeanFactory

BeanFactory是实例化、配置、管理众多bean的容器。BeanFactory可以用接口org,springframework.beans.factory.BeanFactory表示。BeanFactory有多种实现,其中最为常用的是org,springframework.beans.factory.xml.XmlBeanFactory,能加载XML格式的配置文件。在Web程序中用户不需要实例化Beanfactory,Web程序加载的时候会自动实例化BeanFactory,并加载所有的Beans,将各个Bean设置到Servlet、Struts的Action中或者hibernate资源中。在Java程序中,需要从BeanFactory中获取Bean,因此需要实例化BeanFactory,例如,加载ClassPath下的配置文件:

ClassPathResource  cpr= new ClassPathResource("applicationContext.xml");
XmlBeanFactory  factory = new XmlBeanFactory  (cpr);
Iservice service= factory.getBean("service");
……
factory.destroySingletons();  

或者使用文件流加载任意位置的配置文件:

InputStream  in = new FileInputStream("D:\\ApplicationContext.xml");
XmlBeanFactory  factory = new XmlBeanFactory  (in);  

或者用ClassPathXmlApplicationContext加载多个配置文件(以字符串形式传入):

ClassPathXmlApplicationContext  appContext = new ClassPathXmlApplicationContext(  new String [] {"applicationContext1.xml","applicationContext2.xml"} );
BeanFactory factory = (BeanFactory) appContext;
//ApplicationContext继承自BeanFactory接口  

配置Bean

工厂模式

如果一个bean不能通过new直接实例化,而是通过工厂类的某个方法创建的,需要把<bean>的class属性配置为工厂类(或者吧factory-bean属性配置为工厂类对象)

<bean  id="example1" class = "examples.MyBeanFactory" method="createInstance" />
<!--等价于下面的配置-->
<bean  id="example12" factory-bean = "examples.MyBeanFactory" method="createInstance" /> 

构造函数

如果Bean的构造函数带有参数,需要指定构造函数的参数

<bean id = "example" class=" examples.ExampleBean">  <constructor-args><ref bean="BeanId1"/></constructor-args>  <constructor-args><ref bean="BeanId2"/></constructor-args>  <constructor-args><value>1</value></constructor-args>
</bean>  

参数的先后顺序,要与构造函数参数的顺序相同。

单态模式singleton

Bean可以定义是否为单态模式,在非单态模式下,每次请求该Bean都会生成一个新的对象,像数据源等一般配置为单态模式。spring默认为单态模式,如果要使用非单态模式(prototype原型模式),需要把singleton属性设置为false:

<bean id="exampleBean" class="examples.ExamleBean" singleton="false"/>  

property属性

<property name="examProperty" value="pValue" />  

等价于

<property name="examProperty">  <value>pValue</value>
</property>  

注意:

<property name="password">  <value></value>
</property>  

会将password设置为”“,而不是null,如果想设置为null应该为

<property name="password">  <null/>
</property>  

设置对象属性

spring配置文件的Bean之间可以相互引用,引用时用<ref>标签配合Bean的id属性使用,也可以使用内部配置:

<bean id="dao" class = "com.lmb.DaoImpl"></bean>
<bean id="serviceImpl" class="com.lmb.serviceImpl">  <property name="dao">  <ref bean="dao"/>  </property>
</bean>
//ref的bean属性为目标<bean>的id属性

等价于内部配置

<property name="dao">  <bean class="com.lmb.DaoImpl"/>
</property>  

除了使用<ref>的bean属性,还可以使用local、parent,它们与bean属性的作用是一样的,但是,local只能使用本配置文件中的bean,parent只能使用父配置文件中的bean。

list属性

<property name="propName">  <list>  <value>string、integer、double等类型数据</value>  <ref bean="dataSource"/>  </list>
</property>  

set属性

<property name="propName">  <set>  <value>string、integer、double等类型数据</value>  <ref bean="dataSource"/>  </set>
</property>  

map属性

<property name="propName">  <map>  <entry key="key1">  <value>string、integer、double等类型数据</value>  </entry>  <entry key-ref="key2">  <ref bean="dataSource"/>  </entry>  </map>
</property>  

props属性

<property name="propName">  <props>  <prop key="url">http://localhost:8080/lmb</prop>  <prop key="name">lmb</prop>  </ props >
</property>  

destroy-method和init-method属性

destroy-method属性配置关闭方法,如果有配置,在丢弃Java对象时会调用该方法,某些数据源、SessionFactory对象都需要用destroy-method配置关闭方法。Spring在注销这些资源时会调用下面的close方法:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"  destroy-method="close">
……
</bean>  

有些对象在实例化之后需要执行某些初始化代码,但是这些代码不能写进构造函数,这时候可以把初始化代码写进某个方法中,并用<init-method>指定该方法

<bean id="c" class="com.clf.SpringExample"  init-method="init">  

depends-on属性

Spring会默认按照配置文件里的Bean顺序地实例化Bean,但是有时候实例化A对象之前需要先实例化后面的B对象,这时候可以使用depends-on属性强制先实例化B对象:

<bean id="a" clas="com.lmb.A" depends-on="b"></bean>
<bean id="b" clas="com.lmb.B"></bean>  

idref与ref的区别

<idref><ref>的作用是一样的,都是配置Java对象的,不同的是,<idref>只有bean与local属性,没有parent属性
Spring加载XML配置文件时,会检查<idref>配置的Bean在不在,而<ref>只会在第一次调用时才会检查,换句话说,如果Bean不存在,<idref>在启动程序时就会抛出错误,而<ref>只会在运行中抛出错误。

autowire

可以通过Bean的autowire属性设置自动装配规则。使用autowire后不需要再用<property name="" value="" />显式地设置该Bean的属性、依赖关系,Spring会根据反射,自动寻找符合条件的属性,设置到该Bean上,autowire属性定义的不是需要自动装配的属性名,而是自动装配的规则,一旦配置,所有的属性都会遵循autowire定义的规则:

No:即不启用自动装配。Autowire默认的值。

byName:通过属性的名字的方式查找JavaBean依赖的对象并为其注入。比如说类Computer有个属性printer,指定其autowire属性为byName后,Spring IoC容器会在配置文件中查找id/name属性为printer的bean,然后使用Setter方法为其注入。

byType:通过属性的类型查找JavaBean依赖的对象并为其注入。比如类Computer有个属性printer,类型为Printer,那么,指定其autowire属性为byType后,Spring IoC容器会查找Class属性为Printer的bean,使用Setter方法为其注入。

constructor:通byType一样,也是通过类型查找依赖对象。与byType的区别在于它不是使用Setter方法注入,而是使用构造子注入。

autodetect:在byType和constructor之间自动的选择注入方式。

default:由上级标签<beans>的default-autowire属性确定。

dependency-check

有时候某些Bean的属性配置有错误,这种错误在程序启动的时候不会有任何异常,会一直潜伏到Spring调用该Bean时才会被发现。依赖检查能够检查属性是否被设置,如果配置了依赖检查,程序启动是会进行配置校验,以便及时地发现错误。但是需要注意的是,依赖检查是很生硬的,例如设置为object,将会检查所有的Java对象属性,只要有一个属性没有设置,就会抛出异常。属性列表如下:

no或default:不做任何检查,默认

simple:仅检查基本类型、集合属性

object:仅检查Java对象属性

all:检查所有属性

Bean的高级特性

spring程序中,Java bean一般与spring是非耦合的,不会依赖于spring类库。这也是spring的优点。但有时候Java bean需要知道自己在spring框架中的一些属性。spring提供了一些接口,实例化Java bean对象后spring会调用接口的方法。

BeanNameAware接口

BeanNameAware接口帮助Bean知道自己在配置文件中的id。

import  org.springframework.beans.factory.BeanNameAware;
public class  BeanNameTest implements BeanNameAware{  private String beanName;  //Spring会调用该方法  public void setBeanName(String beanName){  this.beanName = beanName;  }  }  

BeanFactoryAware接口

BeanFactoryAware接口帮助Bean知道哪个BeanFactory实例化了自己,BeanFactoryAware接口中有一个回调方法setBeanFactory,初始化该对象后,会回调该方法,将BeanFactory传进来。用法同BeanNameAware。

public interface  BeanFactoryAware{  void setBeanFactory(BeanFactory beanFactory) throws BeanException;
}  

如果Java bean实现了BeanFacoryAware接口,就能够获得BeanFactory对象。BeanFactory还有下面几个常用方法

boolean containsBean(String)判定指定名称的Bean是否存在

Object getBean(String)返回指定名称,如果没有该Bean会抛出异常

Object getBean(String,Class)返回指定名称的Bean,并转化为指定的类对象

boolean isSingleton(String)判断指定名称的Bean是否被配置为单态模式

String[] getAliases(String)返回指定名称的Bean的别名

InitializingBean接口

InitializingBean接口执行初始化方法。InitializingBean接口会在Bean实例化后、所有属性被设置后调用初始化方法。但是使用该接口会与Spring代码发生耦合,因此不推荐使用,Spring推荐使用init-method配置。有关spring的InitializingBean的afterPropertiesSet方法和init-method区别和应用参看本人博客。

public interface InitializingBean{  public void afterPropertiesSet();  //初始化时调用此方法
} 

DisposableBean接口

DisposableBean接口会在Bean对象丢弃时调用销毁方法

public interface DisposableBean{  public void destroy();  //销毁时调用此方法
}  

属性覆盖器

对于一些参数,更实用更简单的方法是使用properties配置,而不是配置在Spring的配置文件中。

PropertyPlaceholderConfigurer属性覆盖器

PropertyPlaceholderConfigurer允许把XML配置的某些参数配置到properties文件中。这在数据库配置中很常用,配置时需要配置一个PropertyPlaceholderConfigurer对象,指定properties文件的位置,然后把替换的属性用形如${jdbc.url}的字符串替代:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  <property name="driverClassName" value="${jdbc.driverClassName}"/>  <property name="url" value="${jdbc.url}"/>  <property name="username" value="${jdbc. username}"/>  <property name="password" value="${jdbc. password}"/>
</bean>  <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  <property name="location" value="classpath:jdbc.properties">
</bean>  jdbc.propertiesjdbc.driverClassName= com.mysql.jdbc.Driver
jdbc.url =jdbc:mysql://localhost:3306/lmb?characterEncoding=UTF-8
jdbc.username =admin
jdbc.password =admin  

总结:core模块是spring最核心、最基本的模块,实现加载配置文件,管理,初始化bean等功能。spring配置文件中可以配置各种各样构造函数的类,不过最常见还是使用不带参数的构造函数。

【Spring学习】ring的core模块应用详解相关推荐

  1. Spring学习(七)bean装配详解之 【通过注解装配 Bean】【自动装配的歧义解决】...

    本文借鉴:Spring学习,@Bean 的用法(特此感谢!) 自动装配 1.歧义性 我们知道用@Autowired可以对bean进行注入(按照type注入),但如果有两个相同类型的bean在IOC容器 ...

  2. Spring学习(六)bean装配详解之 【通过注解装配 Bean】【基础配置方式】

    本文借鉴:Spring学习(特此感谢!) 通过注解装配 Bean 1.前言 优势 1.可以减少 XML 的配置,当配置项多的时候,XML配置过多会导致项目臃肿难以维护 2.功能更加强大,既能实现 XM ...

  3. Spring学习(五)bean装配详解之 【XML方式配置】

    本文借鉴:Spring学习(特此感谢!) 一.配置Bean的方式及选择 配置方式 在 XML 文件中显式配置 在 Java 的接口和类中实现配置 隐式 Bean 的发现机制和自动装配原则 方式选择的原 ...

  4. spring学习(8):log4j.properties 详解与配置步骤

    一.入门实例 1.新建一个JAva工程,导入包log4j-1.2.17.jar,整个工程最终目录如下 2.src同级创建并设置log4j.properties ### 设置### log4j.root ...

  5. Spring学习之AOP的切点表达式详解

    1.背景知识 在Sping中使用AOP的主要工作是配置织入关系,使用<aop:config>标签代表这一段是织入关系的配置 首先,用<aop:aspect>标签声明一个切面,这 ...

  6. Spring Boot的每个模块包详解

    Spring Boot的每个模块包详解,具体如下: 1.spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. 2.spring-boot-s ...

  7. Spring基于注解TestContext 测试框架使用详解

    原创整理不易,转载请注明出处:Spring基于注解TestContext 测试框架使用详解 代码下载地址:http://www.zuidaima.com/share/1775574182939648. ...

  8. python中importlib模块安装_Python中标准模块importlib详解

    Python中标准模块importlib详解 模块简介 Python提供了importlib包作为标准库的一部分.目的就是提供Python中import语句的实现(以及__import__函数).另外 ...

  9. Spring Boot 使用 HikariCP 连接池配置详解

    Spring Boot 使用 HikariCP 连接池配置详解 HikariCP 是一个高性能的 JDBC 连接池组件. Spring Boot 2.x 将其作为默认的连接池组件,项目中添加 spri ...

最新文章

  1. BZOJ 4009 接水果
  2. asp.net的JSONHelper 类
  3. 第九篇 - UITextField
  4. Strongly connected HDU - 4635(tarjan+强连通分量)
  5. netbean下搭建mariadb数据库
  6. 【Elasticsearch】Elasticsearch 存储桶聚合
  7. james邮件服务器的用户信息添加
  8. 取datatable某一列的值_R-缺失值识别与处理
  9. 将一个存放了若干个对象的数组按照对象的某个属性值进行分组
  10. 【转】移动,电信,中行软开,微软,百度等企业工作纯技术性分析
  11. 2022年南京大学计算机考研复试考什么|考研复试时间
  12. w7为什么计算机没有摄像头.,W7笔记本摄像头怎么打开
  13. windows下jenkins批处理执行git pull失败的原因
  14. 先分号分隔 然后逗号分割c语言,分隔符的用法
  15. FaceBook有戏没戏(转)
  16. 神奇英语语法系列(1)——定语从句
  17. Virtual Box与win10系统不兼容问题
  18. 实验五 网络编程与安全 20162316 刘诚昊
  19. abaqus切削为什么没有切屑,教你如何用Abaqus模拟金属切削(二)
  20. 银行从业对证书的建议

热门文章

  1. UIT信息容灾概论(6)
  2. redis3.0.3 安装与配置
  3. Application package 'AndroidManifest.xml' must have a minimum of 2 segments错误
  4. android 保存ArrayListObject至SharedPreferences
  5. android 监听手机电量变化
  6. github的角色和人员结构
  7. TextPaint绘制文字
  8. SmartUpload上传下载及文件名和文件内容中文问题
  9. 【python】再说装饰器与闭包的写法
  10. 操作系统笔记(六)调度