02 Spring框架 简单配置和三种bean的创建方式

整理了一下之前学习Spring框架时候的一点笔记。如有错误欢迎指正,不喜勿喷。

上一节学习了如何搭建SpringIOC的环境,下一步我们就来讨论一下如何利用ioc来管理对象和维护对象关系。

<?xml version="1.0" encoding="UTF-8"?>  
<beans  
    xmlns:util="http://www.springframework.org/schema/util"  
    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-2.5.xsd  
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd"> 
</beans>

这个是applicationContext.xml的 dtd。(补充上一节)

我们知道有以下集几种方法来创建对象:

  • 采用new关键字创建对象
  • 静态工厂方法,例如:Calendar cal=Calendar.getInstance();
  • 对象(现有)工厂方法 所以ioc中在aplicationContext.xml中也对应了三种创建对象的途径
<bean id="" class="">①
<bean id="" class="" factory-method="">②
<bean id="" factory-bean="" factory-method="">③

id可以自定义 Class需要自己在工程中创建 接下来写一个简单的demo

① applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>  
<beans  
    xmlns:util="http://www.springframework.org/schema/util"  
    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-2.5.xsd  
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd"> 
<bean id="c1" class="com.Spring.Demo.HelloWorld">
</beans>

HelloWorld.java :

package com.Spring.Demo;

public class HelloWorld {
    public void show(){
        System.out.println("欢迎Spring!");
    }

}

接下来写一个测试 TestHelloWorld.java :

package com.Spring.Demo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestHelloWorld {
    public static void main(String[] args){
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        HelloWorld hw=(HelloWorld)context.getBean("c1");
        hw.show();
    }

}

运行后控制台输出为:

欢迎Spring!

这是第一种创建对象的方式,下面我们继续看看怎么使用动态工厂创建对象。

<!--静态工厂创建对象配置文件-->
<?xml version="1.0" encoding="UTF-8"?>  
<beans  
    xmlns:util="http://www.springframework.org/schema/util"  
    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-2.5.xsd  
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd"> 

<bean id="service" class="dynamicFactory.ServiceFactory" factory-method="getService"/>
</beans>
//需要创建的对象,实现的接口(接口化编程,降低耦合度)
package staticFactory;

public interface SomeServices {
    String doFirst();
    void doSecond();
}
//实现类,实现上面的接口
package staticFactory;

public class SomeServiceImp implements SomeServices{
    
    @Override
    public String doFirst() {
        System.out.println("print first");
        return null;
        
    }
    
    @Override
    public void doSecond() {
        System.out.println("print second");
        
    }

}
//静态工厂,产生上面类的实例
package staticFactory;

public class ServiceFactory {
    public static SomeServiceImp getService() {
        return new SomeServiceImp();
    }
}
//测试类(Junit)
public class test {

    @Test
    public void Test01() {
        String resource = "staticFactory/applicationContext.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(resource);
        SomeServices service = (SomeServices)ac.getBean("service");
        service.doFirst();
        service.doSecond();
    }
}

控制台输出:

print first
print second

上面的是静态工厂bean的创建方式,接下来我们来看普通工厂对象创建方式:

<?xml version="1.0" encoding="UTF-8"?>  
<beans  
    xmlns:util="http://www.springframework.org/schema/util"  
    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-2.5.xsd  
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd"> 


<bean id="serviceFactory" class="dynamicFactory.ServiceFactory"></bean>
<!--普通工厂bean,factory-bean填的是上面的serviceFactory-->
<bean id="service" factory-bean="serviceFactory" factory-method="getService"/>


</beans>
//需要创建的对象,实现的接口(接口化编程,降低耦合度)
package dynamicFactory;

public interface SomeServices {
    String doFirst();
    void doSecond();
}
//实现类,实现上面的接口
package dynamicFactory;

public class SomeServiceImp implements SomeServices{
    
    @Override
    public String doFirst() {
        System.out.println("print first");
        return null;
        
    }
    
    @Override
    public void doSecond() {
        System.out.println("print second");
        
    }

}
//这个和第二种不同,这里的工厂类方法是非静态的
package dynamicFactory;

public class ServiceFactory {
    public SomeServiceImp getService() {
        return new SomeServiceImp();
    }
}
//测试类(Junit)
public class test {

    @Test
    public void Test01() {
        String resource = "dynamicFactory/applicationContext.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(resource);
        SomeServices service = (SomeServices)ac.getBean("service");
        service.doFirst();
        service.doSecond();
    }
}

控制台输出:

print first
print second

这样我们的三种创建方式就说完了。

未完待续

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT可乐

Java IO详解(三)------字节输入输出流

 File 类的介绍:https://cloud.tencent.com/developer/article/1012532 Java IO 流的分类介绍:ht...

258100
来自专栏栗霖积跬步之旅

创建Task的多种方法

Gradle的Project从本质上说只是含有多个Task的容器,一个Task与Ant的Target相似,表示一个逻辑上的执行单元。 我们可以通过多种方式定义T...

31060
来自专栏java初学

spring框架(1)— 依赖注入

476120
来自专栏Jerry的SAP技术分享

Java异常处理:如何写出“正确”但被编译器认为有语法错误的程序

文章的标题看似自相矛盾,然而我在“正确”二字上打了引号。我们来看一个例子,关于Java异常处理(Exception Handling)的一些知识点。

14130
来自专栏IT技术精选文摘

跟着实例学习ZooKeeper的用法: 队列

使用Curator也可以简化Ephemeral Node (临时节点)的操作。Curator也提供ZK Recipe的分布式队列实现。 利用ZK的 PERSIS...

27870
来自专栏程序源代码

java学习手册-JAVA程序员笔试题(一)

JAVA程序员笔试题(一) 一、选择题: 1、类的成员变量要求仅仅能够被同一package下的类访问,应该使用哪个修辞词 A. Protected、B. Pub...

44850
来自专栏云瓣

解读 IoC 框架 InversifyJS

InversityJS 是一个 IoC 框架。IoC(Inversion of Control) 包括依赖注入(Dependency Injection) 和依...

12620
来自专栏微信公众号:Java团长

Java基础知识详细总结

ClassLoader使用的是双亲委托模型来搜索类的,每个ClassLoader实例都有一个父类加载器的引用(不是继承的关系,是一个包含的关系),虚拟机内置的类...

15230
来自专栏JackeyGao的博客

Python 可变参数的坑

Python 的可变参数有*args的位置可变参数和**kwargs参数可变两种. 今天在DEBUG的时候发现了一个非常棘手的**kwargs的坑.

12320
来自专栏康怀帅的专栏

Bash 条件判断与流程控制相关语句详解

介绍 if case 等语句。 条件判断语句 字符串判断 str1 = str2    当两个字符串有相同内容、长度时为真 str1 != str2   当字符...

27440

扫码关注云+社区

领取腾讯云代金券