这是第二部分。
3. 采用“工厂模式”
· 新建一个包,包名:javamxj.spring.beginning2,在这个包下,新建一个“Hello”接口,这个接口含有一个方法。
Hello.java
|
package javamxj.spring.beginning2;
public interface Hello { void sayHello();
} |
· 分别新建两个类,实现这个接口。
HelloWorld.java
|
package javamxj.spring.beginning2;
public class HelloWorld implements Hello {
public void sayHello() { System.out.println("Hello World!"); } }
|
HelloJavamxj.java
|
package javamxj.spring.beginning2;
public class HelloJavamxj implements Hello {
public void sayHello() { System.out.println("Hello, javamxj!"); } }
|
· 建立一个工厂类,调用上面两个实现接口的子类。
HelloFactory.java
|
package javamxj.spring.beginning2;
public class HelloFactory {
public Hello getHello(String hello) {
if (hello.equals("world")) return new HelloWorld(); else if (hello.equals("javamxj")) return new HelloJavamxj(); else throw new IllegalArgumentException("输入参数错误!"); } }
|
· 最后,利用工厂类,测试一下。
Test.java
|
package javamxj.spring.beginning2;
public class Test { public static void main(String[] args) {
Hello hello = null; HelloFactory factory = new HelloFactory();
hello = factory.getHello("world"); hello.sayHello();
hello = factory.getHello("javamxj"); hello.sayHello(); } }
|
运行Test,控制台输出如下语句:
Hello World!
Hello, javamxj!
4.Setter Injection
讲了这么多,似乎一点都不关Spring的事,别急,下面就看看用Spring是如何实现的。
· 新建一个包,包名:javamxj.spring.beginning3
· 在这个包下,新建一个HelloBean的类,这个类有一个属性:helloWorld属性,这个属性只是一个字符串。可以通过setHelloWorld方法设置这个属性,getHelloWorld方法得到这个属性。
HelloBean.java
|
package javamxj.spring.beginning3;
public class HelloBean {
private String helloWorld = "Hello!World!";
public void setHelloWorld(String helloWorld) { this.helloWorld = helloWorld; }
public String getHelloWorld() { return helloWorld; }
}
|
· 同样,在这个包下,建立一个XML文件,它是Spring配置文件。
bean.xml
|
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans> <bean id="helloBean" class="javamxj.spring.beginning3.HelloBean"> <property name="helloWorld"> <value>Hello! Javamxj!</value> </property> </bean> </beans>
|
Spring配置文件必须遵循spring-beans.dtd定义的内容模型。
这个XML文件在Spring容器中声明了一个HelloBean的实例,并且将它的helloWorld属性设置为“Hello! Javamxj!”。
分析这个XML文件,位于根部的是<beans>元素,它是任何Spring配置文件的根元素。<bean>元素用于告诉Spring容器一个类以及它是如何配置的。这里,id属性用于为Bean helloBean命名,而class属性指定了这个Bean的全限定类名。
在<bean>元素内,<property>元素用于设置一个属性,在本例中它是helloWorld属性。通过使用<property>,我们告诉Spring容器当设置这个属性时调用setHelloWorld方法。greeting属性的值定义在<value>元素内。在这里我设置为“Hello! Javamxj!”。
bean.xml必须在您的CLASSPATH可以存取到的目录中。
· 新建Main.java,测试一下。
Main.java
|
package javamxj.spring.beginning3;
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource;
public class Main { public static void main(String[] args) {
// 直接调用HelloBean HelloBean helloBean = new HelloBean(); System.out.println(helloBean.getHelloWorld());
// 利用Spring调用HelloBean Resource res = new ClassPathResource("javamxj/spring/beginning3/bean.xml"); BeanFactory factory = new XmlBeanFactory(res);
helloBean = (HelloBean) factory.getBean("helloBean"); System.out.println(helloBean.getHelloWorld()); } }
|
这里使用的BeanFactory类就是Spring容器。在将hello.xml文件装入容器后,main方法调用BeanFactory的getBean方法检索出了helloBean服务的一个引用。通过这个引用,它调用了getHelloWorld方法。当我们运行这个Hello应用时,它会打印出“Hello! Javamxj!”。
· 另外,为了更好的调试程序,了解运行机理,建立一个log4j.properties,放在src目录下。
src/log4j.properties
|
log4j.rootLogger=warn, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%c{1} - %m%n
|
5.Constructor Injection
· 新建一个包,包名:javamxj.spring.beginning3
· 新建一个HelloBean.java文件,可以与Setter Injection中的HelloBean比较一下,注意是通过Constructor设置helloWorld属性值的。
HelloBean.java
|
package javamxj.spring.beginning4;
public class HelloBean {
private String helloWorld;
public HelloBean(String helloWorld) { this.helloWorld = helloWorld; }
public void sayHello() { System.out.println(helloWorld); } }
|
· 同样,在这个包下,也需要一个Spring配置文件。
bean.xml
|
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans> <bean id="helloBean" class="javamxj.spring.beginning4.HelloBean"> <constructor-arg> <value>Hello! Javamxj!</value> </constructor-arg> </bean> </beans>
|
这里通过<constructor-arg>来表示将使用 constructor injection。如果constructor的参数不只一个,那么需要利用index属性指定参数的位置索引,即<constructor-arg index="索引值">,索引值从0开始。
· 测试一下。
Main.java
|
package javamxj.spring.beginning4;
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource;
public class Main { public static void main(String[] args) {
Resource res = new ClassPathResource("javamxj/spring/beginning4/bean.xml"); BeanFactory factory = new XmlBeanFactory(res);
HelloBean helloBean = (HelloBean) factory.getBean("helloBean"); helloBean.sayHello(); } }
|
这样,通过BeanFactory的getBean方法,以及xml配置文件,避免了在Main类中直接实例化HelloBean,消除了应用程序(Main)与服务(HelloBean)之间的耦合,实现了IOC(控制反转)或者说实现了依赖的注射(Dependency Injection)。
分享到:
相关推荐
基于这样的背景下,我开源了本示例项目,方便大家快速上手Spring Boot、Spring Cloud 。 每个示例都带有详细的介绍文档、作者在使用过程中踩过的坑、解决方案及参考资料,方便快速上手为你提供学习捷径,少绕弯路...
Spring Boot 学习示例 Spring Boot 2.0 Mysql 5.6 ...spring-boot-helloworld:Spring Boot 3.0 Hello World Test 单元测试示例 spring-boot-scheduler:Spring Boot 3.0 定时任务 scheduler 使用示例 .....
这篇文章将教你快速地上手使用 Spring 框架. 如果你手上有一本《Spring in Action》, 那么你最好从第三部分"Spring 在 Web 层的应用--建立 Web 层"开始看, 否则那将是一场恶梦! 首先, 我需要在你心里建立起 Spring...
下图显示 Spring Boot 在 Spring 生态中的位置:该项目主要的目的是:为 Spring 的开发提供了更快更广泛的快速上手使用默认方式实现快速开发提供大多数项目所需的非功能特性,诸如:嵌入式服务器、安全、心跳检查、...
Spring Boot 2.0:云收藏(Spring Boot 2.0实战开源项目)示例代码 :Spring Boot 2.0 Hello World示例 :Spring Boot定制横幅示例 docker:使用Docker部署Spring Boot示例 :Docker编写+ Spring Boot + Nginx + ...
基于这样的背景下,我开源了本示例项目,方便大家快速上手Spring Boot,Spring Cloud。 每个示例都带有详细的介绍文档,作者在使用过程中踩过的坑,解决方案和参考资料,方便快速上手为你提供学习捷径,少绕弯路,...
该源码是课程 Java Spring案例精讲 ---- Spring框架 的源码,包含Java Spring的最简单的Hello World、IOC、AOP及Log的源码 Spring整体框架中的核心功能,例如:IOC、AOP、Bean生命周期、上下文、作用域、资源处理等...
续上一节(maven使用手册),本文档详细描述了m2eclipse插件的使用,与上一份文档相同,都有非常详细的图解,让你轻松上手m2eclipse插件,附带2个简单的实例(helloworld和Spring2.5.6+Struts2.1.8.1框架的搭建)
代码完成,前端后端分离,SpringBoot-Shiro-Vue 比springboot helloworld 复杂,没有接触过spring生态的应该毕竟难上手
第三节:SpringBoot HelloWorld实现 第二章:SpringBoot项目属性配置 第一节:项目内置属性 第二节:自定义属性 第三节:ConfigurationProperties配置 第三章:SpringBoot之MVC支持 第一节:@RequestMapping配置url...
spring + cxf + restful + soap 方便初学者很快上手。 注解描述 @Path注解的值是一个相对的URI路径,这个路径指定了该Java类的位置,例如/helloworld。在这个URI中可以包含变量,例如可以获取用户的姓名然后作为参数...
Spring Boot教程,技术栈示例代码,快速简单上手教程 SpringBoot学习的相关工程并辅以博文讲解。主要包括入门的Hello World,自定义配置的获取,集成mybatis的xml和注解使用,集成jpa的使用,集成德鲁伊进行项目的...
火龙果软件工程技术中心 在本系列的第一部分,我介绍了如何实现面向方面领域的“HelloWorld”:跟踪和记录方面。利用Spring框架所提供的面向方面编程(Aspect-OrientedProgramming,AOP)功能,您看到了如何使用...
向 Hello World 教程说拜拜技术栈新颖且知识点丰富,学习后可以提升大家对于知识的理解和掌握,可以进一步提升你的市场竞争力 课程预览 以下为商城项目的页面和功能展示,分别为: 商城首页 1商城首页 2 购物车订单...
41 2.9.5 导入和使用范例 41 2.10 例程:jBPM HelloWorld 43 2.11 小结 45 第3章 使用jBPM图形化流程设计器(GPD)设计流程 46 3.1 创建一个新流程 47 3.2 编辑流程定义源 49 3.3 例程:设计一个“复杂的”业务流程 ...