@artman328
2017-09-19T14:23:02.000000Z
字数 9111
阅读 1225
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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://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
@ComponentScan
public class AppConfig {
}