开始学习Spring,每次学习之后都会记一次笔记。

一、什么是Spring。

其实从小就讨厌看定义,长话短说,Spring就是一个轻量级、非侵入式的框架。至于什么是非侵入式的,简单说来就是框架的代码不会侵入到开发者自己写的代码中,所有的框架代码和开发者代码是分离的,仅仅通过配置文件来关联,解耦合。侵入式就是框架的代码会掺和进开发者自己写的代码中,比如Struts就是侵入式的。

二、Spring的框架内容。

至于Spring能实现哪些功能,很多教程上都有详细的长篇解说,这里就不重复叨叨了,不喜欢文字的定义。

简单说说两个常用内容,IoC/DI和AOP。

IoC:Inversion of Control,控制反转。白话文举例解释,你写了一个类A,要在类B中引用类A的对象,通常是在类B中直接实例化,由你控制这一切;IoC就是由Spring框架去实例化类A的对象,实例化的过程由框架控制,你甚至不需要new这个关键字来对类A做什么。

DI:Dependency Injection,依赖注入。IoC的机制注定很多类的实例化都在配置文件中配置,这就决定了需要通过这种特殊的机制才能把不同类之间的调用关系组合起来。由框架把需要的依赖关系注入到不同的业务逻辑中。

AOP:Aspect Oriented Programming,是面向切面编程,也有翻译成面向方面编程。就是可以通过配置文件,把一些诸如日志、事务等类的操作,配置到某些操作之间,就好比数据库中的触发器一样,在某些条件下触发指定方法的执行。

三、实例操作IoC/DI

操作系统:Mac OS X 10.8.3

开发工具:MyEclipse 10.0

开发环境:JDK 6、Spring 3.0

1、新建Web Project,命名为SpringStudy。

2、在左侧Project Explorer中右击SpringStudy,选择“MyEclipse”——“Add Spring Capabilities...”,默认选择“Spring 3.0 Core Libraries”。

java 非侵入式日志 库 什么是非侵入式_配置文件

 

下一步,选择applicationContext.xml文件的存储路径和文件名,该文件就是Spring的配置文件,所有的类的实例都可以在这个文件中以<bean>标签的形式配置出来。

java 非侵入式日志 库 什么是非侵入式_xml_02

有些人比较喜欢把配置文件放到WebRoot/WEB-INF文件夹下面,这时在读取applicationContext.xml时稍有不同,代码请参照后面。

3、新建包com.ethan.api,在该包下新建类HelloApi.java接口,声明一个方法helloPrint():

1 public interface HelloAPI {
2     
3     public void helloPrint();
4 
5 }

新建包com.ethan.impl,在该包下新建类HelloImpl.java实现接口HelloApi:

1 public class HelloImpl implements HelloAPI {
2 
3     @Override
4     public void helloPrint() {
5         System.out.println("Hello Spring~");
6     }
7 
8 }

打开applicationContext.xml文件,配置这个类:

1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans
 3     xmlns="http://www.springframework.org/schema/beans"
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 5     xmlns:p="http://www.springframework.org/schema/p"
 6     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
 7 
 8 <bean name="helloBean" class="com.ethan.impl.HelloImpl"></bean>
 9 
10 </beans>

新增的一行是:

<bean name="helloBean" class="com.ethan.impl.HelloImpl"></bean>

name相当于实例化对象的名字,class指定要实现的类。

此时便可以在其他类中通过读取配置文件来调用这个HelloImpl类了。

4、新建包com.ethan.test,在该包中新建类Client,在main函数中读取配置文件,并调用刚刚配置的bean:

1 public class Client {
 2 
 3     public static void main(String[] args) {
 4         
 5         ApplicationContext context = new FileSystemXmlApplicationContext("WebRoot/WEB-INF/applicationContext.xml");
 6         
 7         HelloAPI api = (HelloAPI)context.getBean("helloBean");
 8         
 9         api.helloPrint();
10 
11     }
12 
13 }

注意第5行,前面说过,如果把配置文件applicationContext.xml放到WEB-INF下面,就需要通过FileSystemXmlApplicationContext类指定相对路径来读取,如果仅仅是按照默认方式放到src下面,则可以通过如下方式读取:

1 Application context = new ClassPathXmlApplicationContext("applicationContext.xml");

第7行,context.getBean("helloBean")中的"helloBean",就是上一步在applicationContext.xml中配置的bean的name。

最后完整的项目框架为:

java 非侵入式日志 库 什么是非侵入式_配置文件_03

 

运行Client.java文件,得到输出内容:

java 非侵入式日志 库 什么是非侵入式_实例化_04

 

So easy~妈妈再也不用担心我的学习~~~

**以上内容纯属个人理解,定有不妥之处,还请大牛指正**