- Bean发展历史
JAVA bean:
- 要有默认构造函数
- 所有属性都是private的
- 提供getter setter
- 实现了serializable接口可以序列化
这个最简单的java bean开始出现是为了java gui可视化编程用的。
EJB
在实际企业开发中,需要实现事务,安全分布式,javabean就不好用了。sun公司就开始往上面堆功能,这里java bean就复杂为EJB。
POJO
EJB很强大,但是太重了,没有必要每次都用。此时出现了DI、AOP技术,通过简单的java bean也能完成EJB的工作,这是java bean简化为POJO,其实就是普通的java bean,不过融合了DI、AOP技术。
Spring
Spring诞生了,Spring赋予POJO魔力的方式之一就是用DI来装饰它。
Spring做的就是简化JAVA开发
- DI(Dependency Injection)依赖注入
没有什么神奇的,简单的譬如说构造器注入,就是构造器传入参。
还可以通过xml将参数注入,类似下面的方式注入request被声明为spring的bean了,这种行为也称之为装配,把request、arg、value装配到一起了。
DI.png
DI的好处: 像示例中,knight对象不需要关注是什么类型的request,也不用关注request来自哪里,spring通过配置,就能知道他们的依赖关系,这样就避免强耦合,对象不需要管理或者创建这个依赖关系。
Q:这个装配的工作是怎么实现的呢?
A:Spring通过Application Contex(应用上下文)来装载bean的定义并且组装起来。这些都是由Spring来做的工作,Spring本身也有很多Application Context的实现,用来组装bean。
Application Context
上述例子中是通过XML文件配置的,所以选择的是ClassPathXmlApplicationContext。所以在该Spring的main方法中要调用ClassPathXmlApplicationContext来加载xml文件,并获得knight对象。
public static void main(String[] args){
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("**/**/**.xml");
Knight knight = ctx.getBean(Knight.class);
…………
ctx.close();
}
Q:DI和IoC的关系?
A:IoC是目标,DI是方法,通过DI来实现IoC。DI通常有构造器注入和setter注入。
- AOP
把和业务无关的事务处理(安全、日志……)等独立模块抽离出来,不和业务逻辑交织在一起,并且各个组件的非业务模块能重用。
AOP能保持POJO的简单性。AOP的xml实现:
AOP.png
这里使用了AOP的配置命名空间,minstrel声明为一个切面,pointcut定义了切入点。(切入点的表达方式是AspectJ)。
所以通过这样的xml配置就可以声明spring的切面,并且在knight中不需要写代码去调用mistrel就可以实现了。
- 模板
Spring提供了多种多样的模板来消除重复的样式代码,非常典型的就是JdbcTemplate。
以往的JDBC实现需要写一大堆创建数据库连接、捕获数据库异常、清理数据……的代码,每做一次数据库操作可能都要try catch一大堆代码,不光JDBC,其他的JMS、JNDI、REST一样有这样的问题。这些重复的样式代码太多了,导致核心的业务代码逻辑反而不被突出。
所以Spring提供了模板,例如提供了jdbcTemplate.queryForObject方法,把重复的样式代码封装在了jdbcTemplate里面,所以写代码的时候不需要关心这些样式代码,直接调用jdbcTemplate就行。
JdbcTemplate.png
学习了Spring如何通过DI、AOP、模板来简化java中的复杂开发,这些都是基于在xml中配置bean和aspec来做的,但是xml文件是如何被加载,又是被加载到哪里去了,这些就是[容器]来解决的。
- 容器
Spring中所有对象都生存在容器中,容器负责创建、装配、配置并管理对象的整个生命周期(从new到finalize)。
Spring容器的归纳为2种实现方式:
-
bean工厂
org.springframework.beans.factory.BeanFactory最简单的容器,提供基本DI支持。一般现在太简单不用。 -
ApplicationContex
org.springframework.context.ApplicationContext基于BeanFactory构建,提供框架级别的服务(例如发布事件给感兴趣的监听者),一般都用这个。上面的例子中就是通过ClassPathXMLApplicationContext来配置加载bean,ApplicationContext准备就绪后,就可以通过getBean来获取bean。这样就等于创建好了一个容器。
网友评论