《轻量级java ee企业应用实战》-spring笔记

spring核心容器的理论很简单:spring核心容器就是一个超级大工厂,所有的对象(包括数据源、Hibernate SessionFactory等基础性资源)都会被当成spring核心容器管理的对象。spring把容器中的一切对象统称为bean。

配置文件中的<bean.../>元素默认以反射方式来调用该类无参数的构造器。

比如:

<bean id="person" class="com.ken.Person">
	<property name="axe" ref="axe" />
</bean>

spring框架解析该<bean.../>元素后将可以得到两个字符串,其中idStr的值为“person”(解析<bean.../>元素的id属性得到的值),classStr的值为“com.ken.Person”(解析<bean.../>元素的class属性得到的值)。

也就是说,spring底层会执行如下形式的代码:

String idStr = ...
String classStr = ...
Class clazz = Class.forName(classStr);
Object obj = clazz.newInstance();
container.put(idStr, obj);

<property.../>作为<bean.../>元素的子元素,它驱动spring在底层以反射执行一次setter方法。其中,的name属性值决定执行哪个setter方法。

也就是说,spring底层会执行如下形式的代码:

String nameStr = ...
String refStr = ...
String setterName = "set" +nameStr.subString(0,1).toUpperCase() + nameStr.subString(1);
Object paramBean = container.get(refStr);
Method setter = clazz.getMethod(setterName, paramBean.getClass());
setter.invoke(obj, paramBean);

也就是说,<bean.../>元素驱动spring调用构造器创建对象;<property.../>子元素驱动spring执行setter方法,这两部是先后执行的,中间几乎没有任何间隔。

ApplicationContext是spring容器最常用的接口,它有两个实现类:ClassPathXmlApplicationContext和FileSystemXmlApplicationContext。对于java项目而言,类加载路径总是最稳定的,因此通常总是使用ClassPathXmlApplicationContext。

ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");//创建容器
Person p = ac.getBean("person", Person.class);

spring框架的核心功能有两个:

1.spring容器作为超级大工厂,负责创建、管理所有的java对象,这些java对象被称为bean。

2.spring容器管理容器中bean之间的依赖关系,spring使用“依赖注入”的方式来管理bean之间的依赖关系。

依赖注入是一种优秀的解耦方式。依赖注入让spring的bean以配置文件组织在一起,而不是以硬编码的方式耦合在一起。

使用spring框架之后的两个主要改变是:

1.程序无须使用new调用构造器去创建对象。所有的java对象都可以交给spring容器去创建。

2.当调用者需要调用被依赖对象的方法时,调用者无须主动获取被依赖对象,只要等待spring容器注入即可。

spring推荐面向接口编程,这样可以更好地让规范和实现分离,从而提供更好的解耦。对于一个Java EE应用,不管是dao组件,还是业务逻辑组件,都应该先定义一个接口,该接口定义了该组件应该实现的功能,但功能的实现则由其实现类提供。

从spring 2.0开始,spring推荐采用xml schema来定义配置文件的语义约束。xml配置文件提供了一些标签,这些标签使配置更简单。

chinese实例与具体的Axe实现类没有任何关系,chinese实例仅仅与Axe接口耦合,这就保证了chinese实例于Axe实例之间的松耦合——这也是spring强调面向接口编程的原因。

1.设置注入

2.构造注入。就是驱动spring在底层以反射方式执行带指定参数的构造器,当执行带参数的构造器时,就可利用构造器参数对成员变量执行初始化——这就是构造注入的本质。

<bean.../>元素默认总是驱动spring调用无参数的构造器来创建对象,那怎样驱动spring调用有参数的构造器去创建对象呢?<constructor-arg.../>子元素,每个<constructor-arg.../>子元素代表一个构造器参数。

<bean id="chinese" class="com.ken.Chinese">
	<constructor-arg ref="steelAxe" />//驱动spring调用Chinese带一个参数的构造器来创建对象
</bean>

上面的代码相当于:

String idStr = ...
String refStr = ...
Object paramBean = container.get(refStr);
Object obj = new com.ken.Chinese(paramBean);
container.put(idStr, obj);

摘录于:轻量级java ee企业应用实战

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值