@artman328
2017-09-19T14:23:02.000000Z
字数 9111
阅读 1308
Spring Java Framework
在面向对象的编程世界里,一切事物都是类。各种类的对象相互交互完成业务过程。一个对象往往需要调用其它类的对象的方法来完成一些工作,通常,这样的对象需要自己创建这些其它类的对象来供自己使用。这会导致此对象的职责过重(需要自己管理其它类的对象),同时,会把自己与这些其它类紧紧联系在一起。
新的思路是:由一个容器类对象来管理所有类的对象,当一个对象需要一个其它类的对象来完成工作时,这个“其它类的对象”会被容器“注入”到此对象,此对象不必要自己创建这个“其它类的对象”。所有类的对象的生命周期,都由这个容器类来进行统一管理。
有一个业务类 DataService 用于提供数据服务,我们可提供数据给它进行处理,如:整理数据、输出数据等。
对于“输出数据”,我们希望可以根据需求输出到任意设备,如:磁盘、打印机等。因此,我们有两个类,DiskWriter 和 PrinterWriter,分别负责输出数据到磁盘和打印机。
因此,当需要输出数据时,DataService 类的对象要自己创建一个用于“输出数据”的对象(可以是 DiskWriter 或 PrinterWriter 的对象,这需要根据需求来决定),然后通过这个对象把数据输出到指定的设备。
我们先写 DiskWriter 类
package org.artmansoft.demo;public class DiskWriter {public void write(String data) {//这里是实现写入磁盘的代码,为简便起见,略过System.out.println("已经将数据: " + data + " 写入磁盘!");}}
然后是 PrinterWriter 类:
package org.artmansoft.demo;public class PrinterWriter {public void write(String data) {//这里是实现写入打印机的代码,为简便起见,略过System.out.println("已经将数据: " + data + " 写入打印机!");}}
接着是 DataServer 类:
package org.artmansoft.demo;public class DataServer {private String data;private DiskWriter diskWriter; //这里直接指明了 DiskWriter 类以便写入磁盘,如果以后要写入其它设备如打印机,需要改动到其它类public void setData(String data) {this.data = data;}public void write() {if(this.writer == null){this.writer = new DiskWriter(); // 这里需要 new 一个 DiskWriter 对象}this.diskWriter.write();}}
最后是主程序类 App.java:
package org.artmansoft.demo;public class App {private static DataService dataService;public static void main(String[] args) {dataService = new DataService(); //主程序需要 new 一个数据服务对象dataService.setData("77778888");dataService.write(); // 已经将数据: 77778888 写入磁盘!}}
我们先写一个接口:
package org.artmansoft.demo;public interface IWriter {public void write(String data);}
DiskWriter 类
package org.artmansoft.demo;public class DiskWriter implements IWriter {public void write(String data) {//这里是实现写入磁盘的代码,为简便起见,略过System.out.println("已经将数据: " + data + " 写入磁盘!");}}
PrinterWriter 类:
package org.artmansoft.demo;public class PrinterWriter implements IWriter {public void write(String data) {//这里是实现写入打印机的代码,为简便起见,略过System.out.println("已经将数据: " + data + " 写入打印机!");}}
DataServer 类:
package org.artmansoft.demo;public class DataServer {private String data;private IWriter writer; //这里用了接口 IWriter,不论写入任何设备,相应的类都实现了 IWriter 接口,这里不需要改动public void setData(String data) {this.data = data;}public void write() {if(this.writer == null){this.writer = new PrinterWriter(); // 这里需要 new 一个 具体的类对象,如果写入其它设备,需要改动}this.writer.write();}}
最后是主程序类 App.java:
package org.artmansoft.demo;public class App {private static DataService dataService;public static void main(String[] args) {dataService = new DataService(); //主程序需要 new 一个数据服务对象dataService.setData("909099");dataService.write(); // 已经将数据: 909099 写入打印机!}}
我们先写一个接口:
package org.artmansoft.demo;public interface IWriter {public void write(String data);}
DiskWriter 类
package org.artmansoft.demo;public class DiskWriter implements IWriter {public void write(String data) {//这里是实现写入磁盘的代码,为简便起见,略过System.out.println("已经将数据: " + data + " 写入磁盘!");}}
PrinterWriter 类:
package org.artmansoft.demo;public class PrinterWriter implements IWriter {public void write(String data) {//这里是实现写入打印机的代码,为简便起见,略过System.out.println("已经将数据: " + data + " 写入打印机!");}}
DataServer 类:
package org.artmansoft.demo;public class DataServer {private String data;private IWriter writer; //这里用了接口 IWriter,不论写入任何设备,相应的类都实现了 IWriter 接口,这里不需要改动public void setData(String data) {this.data = data;}public void setWriter(IWriter writer) {// writer 由容器注入,并没有在这里 new 一个出来,不论替换到什么输出,这个类不用改动!this.writer = writer;}public void write() {this.writer.write();}}
最后是主程序类 App.java:
package org.artmansoft.demo;public class App {private static DataService dataService;public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); //建立一个容器类对象,它会根据配置文件 beans.xml 装入定义的类对象//dataService = new DataService(); 主程序不需要 new 一个数据服务对象dataService = (DataService) context.getBean("dataService"); //向容器要这个对象dataService.setData("909099");dataService.write(); // 已经将数据: 909099 写入打印机!}}
配置文件 beans.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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="disk" class="org.artmansoft.demo.DiskWriter"></bean><bean id="printer" class="org.artmansoft.demo.PrinterWriter"></bean><bean id="dataService" class="org.artmansoft.demo.DataService"><!-- 这里把打印机注入--><property name="writer" ref="printer"></property><!--下一行可以注入磁盘<property name="writer" ref="disk"></property>--></bean></beans>
我们先写一个接口:
package org.artmansoft.demo;public interface IWriter {public void write(String data);}
DiskWriter 类
package org.artmansoft.demo;@Component("disk")public class DiskWriter implements IWriter {public void write(String data) {//这里是实现写入磁盘的代码,为简便起见,略过System.out.println("已经将数据: " + data + " 写入磁盘!");}}
PrinterWriter 类:
package org.artmansoft.demo;@Component("disk")public class PrinterWriter implements IWriter {public void write(String data) {//这里是实现写入打印机的代码,为简便起见,略过System.out.println("已经将数据: " + data + " 写入打印机!");}}
DataServer 类:
package org.artmansoft.demo;@Component("dataService")public class DataServer {private String data;private IWriter writer; //这里用了接口 IWriter,不论写入任何设备,相应的类都实现了 IWriter 接口,这里不需要改动@Value("数据的默认值")public void setData(String data) {this.data = data;}@Autowired //自动注入一个实现了IWriter接口的类的对象@Qualifier("printer") //如果只有一个 IWriter 实现,此句可省public void setWriter(IWriter writer) {// writer 由容器注入,并没有在这里 new 一个出来,如果替换到其它输出,这个类需要改动!this.writer = writer;}public void write() {this.writer.write();}}
最后是主程序类 App.java:
package org.artmansoft.demo;public class App {private static DataService dataService;public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); //建立一个容器类对象,它会根据配置文件 beans.xml 装入定义的类对象//dataService = new DataService(); 主程序不需要 new 一个数据服务对象dataService = (DataService) context.getBean("dataService"); //向容器要这个对象dataService.setData("909099");dataService.write(); // 已经将数据: 909099 写入打印机!}}
配置文件 beans.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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 配置内容被大大简化 --><context:component-scan base-package="org.artmansoft.demo" /></beans>
我们先写一个接口:
package org.artmansoft.demo;public interface IWriter {public void write(String data);}
DiskWriter 类
package org.artmansoft.demo;@Component("disk")public class DiskWriter implements IWriter {public void write(String data) {//这里是实现写入磁盘的代码,为简便起见,略过System.out.println("已经将数据: " + data + " 写入磁盘!");}}
PrinterWriter 类:
package org.artmansoft.demo;@Component("disk")public class PrinterWriter implements IWriter {public void write(String data) {//这里是实现写入打印机的代码,为简便起见,略过System.out.println("已经将数据: " + data + " 写入打印机!");}}
DataServer 类:
package org.artmansoft.demo;@Component("dataService")public class DataServer {private String data;private IWriter writer; //这里用了接口 IWriter,不论写入任何设备,相应的类都实现了 IWriter 接口,这里不需要改动@Value("数据的默认值")public void setData(String data) {this.data = data;}@Autowired@Qualifier("printer")public void setWriter(IWriter writer) {// writer 由容器注入,并没有在这里 new 一个出来,如果替换到其它输出,这个类需要改动!this.writer = writer;}public void write() {this.writer.write();}}
最后是主程序类 App.java:
package org.artmansoft.demo;public class App {private static DataService dataService;public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); //建立一个容器类对象,它会根据配置类扫描需要建立对象的类//dataService = new DataService(); 主程序不需要 new 一个数据服务对象dataService = (DataService) context.getBean("dataService"); //向容器要这个对象dataService.setData("909099");dataService.write(); // 已经将数据: 909099 写入打印机!}}
配置类 AppConfig:
@Configuration@ComponentScanpublic class AppConfig {}