1. 关于轻量重量级的解释
夏昕说:现在的轻量级和重量级的确很难区分了,没有一个明确的衡量标准,之前有人说,有classloader的算是重量级;也有人说,超过3MB的算是重量级,spring core算是轻量级的,但是加上期于的部件,估计就得列入重量记的范畴了。
林信良说:用了spring并不等于轻量级开发。重点是您有没有采纳其精神,用了IOC就轻量级了吗?不见得。什么都来不DI,我看也是很沉重的;如果你在设计时善用IoC,即使不用spring也是轻量级。不要为了spring而spring。
2. IoC的理解
Don't call me,I will call you!程序不依赖于实现,而是依赖与抽象接口。在设计业务类时,我们设计为它依赖于某抽象接口,具体的需要哪个实现类是由配置文件来帮我们注入的。这就是面向接口编程的思想,当业务需求发生变动时,我们只需修改其实现类的具体实现,而接口并没有改变,所以低层业务代码不做任何改动,既增加了代码的复用率,也是功能接口变得清晰。Don't call me,you should call my interface!
3. DI 依赖注入的理解
保留抽象接口,让组件依赖抽象接口,当组件要与其他实际的对象发生依赖关系时,由抽象接口来注入依赖的实际对象。依赖注入,注入你所依赖的实现类,由 spring容器帮你注入适合的实现类,而不是你自己去创建bean实例。有3种基本实现方式:Interface injection、Setter injection与Constructor injection。
4. 应用程序中获取bean
1 <bean id="helloBean" class="chapter2.HelloBean">
2 <property name="helloWord">
3 <value>Hello yangay!</value>
4 </property>
5 </bean> public static void main(String[] args) {
Resource rs = new ClassPathResource("applicationContext.xml");//从classpath下加载配置信息
BeanFactory factory = new XmlBeanFactory(rs);//基于xml格式配置文件的实例化方式,得到一个BeanFactory
HelloBean hello = (HelloBean)factory.getBean("helloBean");//获取id="helloBean"的bean,此时可以调用bean里定义的所有方法
System.out.println(hello.getHelloWord());
}
这是通过beanFactory管理Bean的方式,BeanFactory负责读取Bean定义文件;管理对象的加载、生成;维护Bean对象之间的依赖关系;负责Bean的生命周期,对于简单的应用程序来说,使用BeanFactory就已经足够来管理Bean了。BeanFactory接口提供了六个方法管理Bean。
另外还可以通过ApplicationContext来获取Bean对象:
1 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");//从classpath下加载配置信息
2 HelloBean hello = (HelloBean)ctx.getBean("helloBean");//获取id="helloBean"的bean,此时可以调用bean里定义的所有方法
第二章 spring IoC、AOP实例及分析
1. IoC实例一
控制反转用得最多的是为业务类注入Bean对象,典型的应用是在结合struts开发是,为struts的action类来注入springDao,这样在业务层如action类中不再介入spring API,但同时又可以利用spring提供的所有便捷功能。低层实现细节发生的变化,对业务层来说是透明的,不但降低了程序的偶合性,而且也提高了DAO 对象的重用性。在这个例子中,为了简单起见,我们只为HelloBean注入了一个字符串,而不是注入实体Bean。但这只体现出了控制反转的特点,对于依赖注入DI并没有得到明显的体现。
1)首先编写一个简单的JAVABEAN
1 public class HelloBean {
2 private String helloWord;3 public String getHelloWord() {
4 return helloWord;
5 }
6 public void setHelloWord(String helloWord) {
7 this.helloWord = helloWord;
8 }
9 }
2)接下来编写 Bean定义文件,定义文件告诉spring如何完成以来关系的注入等动作。我们这里命名文件为applicationContext.xml,定义文件中省略了xml文件的头
1 <bean id="helloBean" class="chapter2.HelloBean">//应用程序中用于取得bean的标志
2 <property name="helloWord">//设置了bean中setter的名称
3 <value>Hello yangay!</value>//设置了将要注入的值
4 </property>
5 </bean>
3)最后编写一个简单的示范程序
1 public class SpringDemo {
2
3 public static void main(String[] args) {
4 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
5 HelloBean hello = (HelloBean)ctx.getBean("helloBean");//获取id="helloBean"的bean,此时可以调用bean里定义的所有方法
6 System.out.println(hello.getHelloWord());
7 }
8 }
运行之,将会看到在bean定义文件中为"helloWord"设置的值"Hello yangay!"被打印出来。
--------------------
2. 1. IoC实例二
其实spring IoC的初衷就是降低程序的偶合性,使开发者面向接口编程,使业务层设计不以来于实现,具体依赖与哪个bean是在speing培植文件中来定义的。同样在这里写一个示范程序,包括一个接口,两个实现类,一与业务有关的Business类,Business类依赖的是接口,而不是接口的实现,具体需要哪个实现是由spring容器来实现注入的。
1)接口
只声明了一个保存的方法
1 public interface IDeviceWriter {
2 void svaeToDevice();
3 }
2)第一个实现IDeviceWriter接口的类,存储到软盘
1 public class FloppyWriter implements IDeviceWriter{
2
3 public void svaeToDevice() {
4 System.out.println("存储至软盘");
5 }
6 }
3)第二个实现IDeviceWriter接口的类,存储到硬盘
1
2 public class DiskWriter implements IDeviceWriter{
3
4 public void svaeToDevice() {
5 System.out.println("存储至硬盘");
6 }
7 }
4)业务类,依赖于抽象的IDviceWriter接口,要 存储到磁盘还是软盘是由spring配置文件来决定的
1 public class Business {
2
3 private IDeviceWriter writer;
4 public void save(){
5 writer.svaeToDevice();
6 }
7
8 public IDeviceWriter getWriter() {
9 return writer;
10 }
11 public void setWriter(IDeviceWriter writer) {
12 this.writer = writer;
13 }
14 }
5)bean的定义文件
1 <bean id="floppyWriter" class="chapter2.FloppyWriter"/>
2 <bean id="diskWriter" class="chapter2.FloppyWriter"/>
3 <bean id="business" class="chapter2.Business">
4 <property name="writer">
5 <ref bean="floppyWriter"/>
6 </property>
7 </bean>
将id为writer的bean注入到business Bean中,在Business对象中可以调用FloppyWriter的所有方法,实现了将数据保存至软盘的功能。
6)测试类
1 public class SpringDemo2 {
2
3 public static void main(String[] args) {
4 Resource rs = new ClassPathResource("applicationContext.xml");
5 BeanFactory factory = new XmlBeanFactory(rs);
6 Business business = (Business) factory.getBean("business");
7 business.save();
8 }
9 }
现在如果我们想要把数据保存到硬盘,而不是软盘了,我们只需要修改bean的配置文件,让业务类Business依赖于diskWriter既可,Business不做任何的修改。这也是面向接口编程的好处所在。