这几天都在学习怎么使用SSH,首先是从Spring开始的,一些程序代码都是参考《Java Web开发技术大全--JSP+Servlet+Struts+Hibernate+Spring+AJAX》这本书写的。
1.反向控制(Inversion of Control,Ioc)和依赖注入
任何有应用价值的系统都至少有两个类来互相配合工作,通过由一个主要的入口类来启动程序,然后在这个类中创建另一个类的对象实例,并进行相应的操作。这种工作方式是由调用者主动创建的对象实例,是主动的工作方式。
而如果使用Ioc,创建对象的任务并不是由调用者来完成的,而是通过外部的协调者(在Spring中是Spring Ioc容器)来完成的。因此也可以认为调用者要依赖Spring Ioc容器来获得(或者称为注入)对象实例,所以也可以将Ioc称为依赖注入。
2.面向方面编程(AOP)
手动创建的Java Project是不带Spring功能的,需要我们通过手动设置来完成。具体操作是:myecplise->project capabilities->add spring capabilities。这样project下就有了一个applicationContext.xml文件。Spring就是通过配置该xml来实现其功能的。
Spring模式从简单来讲就是一个接口一个实现类,然后还有一个测试类。
我们这里创建一个接口HelloService,实现类HelloServiceImpl,测试类FirstSpring。
HelloService.java
package chapter22;
//创建一个HelloService接口,Spring框架中的接口类。
public interface HelloService {
public String getGreeting();
}
HelloServiceImpl.java
package chapter22;
//创建HelloService接口的实现类HelloServiceImpl,这个类中的属性将成为Bean被装配。
public class HelloServiceImpl implements HelloService {
private String greeting;// JavaBean,HelloServiceImpl类的对象实例会通过
// Spring的xml配置文件来建立
public String getGreeting()// get方法
{
System.out.println("getGreeting()方法被调用");
return greeting;
}
public void setGreeting(String greeting)// set方法
{
this.greeting = greeting;
System.out.println("setGreeting()方法被调用");
}
}
FirstSpring.java
package chapter22;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
//使用ApplicationContext配置JavaBean
public class FirstSpring {
public static void main(String args[]) {
// 方案一:使用Spring。
ApplicationContext ctx = new FileSystemXmlApplicationContext(
"src//applicationContext.xml");
HelloService hello = (HelloService) ctx.getBean("helloservice");
System.out.println(hello.getGreeting());
// 方案二:不适用Spring。
HelloServiceImpl hello2 = new HelloServiceImpl();
hello2.setGreeting("Xu Wei");
System.out.println(hello2.getGreeting());
// 方案三:使用Spring,ClassPathXmlApplicationContext
ApplicationContext ctx2 = new ClassPathXmlApplicationContext(
"applicationContext.xml");
HelloService hello3 = (HelloService) ctx2.getBean("helloservice");
System.out.println(hello3.getGreeting());
// 结论:
// 方案一和方案二输出的结果是一样的,其实实现的本质也是一样的,
// 唯一的区别就是建立HelloServiceImpl类实例对象的方法不一样。
// 方案一时通过Spring的xml文件配置来得到,而方案二则是直接通过代码来建立。
// FileSystemXmlApplicationContext:通过绝对或相对路径制定XML配置文件,并装载XML文件的配置信息。
// ClassPathXmlApplicationContext:从类路径中搜索XML配置文件。可以使用FileSystemXmlApplicationContext类
// 替换ClassPathXmlApplicationContext,但要将构造方法的参数值改为"applicationContext.xml"
}
}
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="helloservice" class="chapter22.HelloServiceImpl">
<property name="greeting" value="Xu Wei"></property>
</bean>
</beans>
最后右键FirstSpring->run as->java application。第一个spring程序就完成了。
PS:手动配置JavaBean有两种方式,上面提到的都是应用上下文(ApplicationContext)来配置的,下面介绍使用BeanFactory来进行配置的方法。
HelloService.java和HelloServiceImpy.java都不需要改变,只需要改变测试类。
TeatBeanFactory.java
package chapter22;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.*;
import org.springframework.core.io.FileSystemResource;
//Bean工厂(BeanFactory)手动配置JavaBean。
public class TestBeanFactory {
public static void main(String args[]) {
BeanFactory factory = new XmlBeanFactory(new FileSystemResource(
"src//applicationContext.xml"));
HelloService hello = (HelloService) factory.getBean("helloservice");
System.out.println(hello.getGreeting());
}
/*
* 单从装配Bean上看,ApplicationContext和BeanFactory类似,单ApplicationContext比BeanFactory提供了更多的功能
* ,如国际化,装载文件资源、向监听器Bean发送事件等。如此,如果要使用更多的功能,最好使用ApplicationContext来装配Bean
*
* 装配Bean实际上就是在XML中配置文件JavaBean的相关信息,然后由Spring框架读取该配置文件,并创建相应的JavaBean对象实例
* 的过程。通常来讲,需要用手工的方式制定Spring装配JavaBean时的动作,如调用哪一个构造方法,初始化指定的JavaBean属性等。
*/
}