Spring之容器和配置初识

通过前两篇文章的学习,对spring有了初步的认识,并且应该认识到,spring的核心在于控制反转IOC和依赖注入DI

spring是怎么达到这个目标呢?

我们都已经知道理利用spring框架,依赖的注入由spring容器来进行,那么当然需要一些配置信息来告诉spring怎么注入。这就是spring元数据的配置(即bean的配置)。

综上,spring通过容器和元数据的配置来实现基本的功能。

通过本文达到,两个目标:

1.初步的认识spring容器。

2.初步认识spring元数据的配置

ApplicationContext

接口 org.springframework.context.ApplicationContext 代表了Spring IoC容器,它负责实例化、配置、组装beans. Spring通过读取元数据的配置进行以上的操作,元数据的配置有多种形式,包括xml、注解和JSR标准。

且Spring 提供了几种ApplicationContext的实现,如ClassPathXmlApplicationContext、FileSystemXmlApplicationContext,顾名思义,它们读取基于xml的元数据配置。

程序示例

说明

下面通过一个简单的例子说明spring容器的简单用法和spring XMl元数据配置。

这个例子很简单,就是获取系统中的用户,然后打印出来。整个程序分为三各层次,模拟dao、service和客户端,客户端调用service,service调用dao。Service对dao的依赖由spring容器来管理。代码结构如下图:

代码

代码由客户端调用开始,一点点深入底层,其中的注释详细的说明了相关的要点。

首先是User类:

public class User {

    public int id;

    public String name;

    /**
     * @param id
     * @param name
     */
    public User(int id, String name) {
       super();
       this.id = id;
       this.name = name;
    }

    @Override
    public String toString() {
       return "User [id=" + id + ", name=" + name + "]";
    }
    }

客户端

客户端由main函数调用模拟,代码如下:

package com.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.test.service.UserService;

/**  

 * @Description: 客户端首先初始化spring容器,然后从容器中获取benn调用其相应方法。和传统不一样的地方在于,
 * 业务对象UserService 的实例化不是由客户端通过new 来产生,而是直接从spring容器中获取。
 *
 * 本示例例环境为eclipse
 */
public class TestMain {
    public static void main(String[] args) {
       /**
        * ApplicationContext代表spring容器,而ClassPathXmlApplicationContext是它的一个实现,它从类路径下读取相应的
        *  xml 元数据配置,并初始化容器。其中allbean.xml是相应的元数据配置
        */
       ApplicationContext context = new ClassPathXmlApplicationContext("allbean.xml");

       //从容器中获取名称为 user 的 userService 对象,这个名称在配置文件之后配置。
       UserService userService = context.getBean("user", UserService.class);

       System.out.println(userService.getUser());

       //可以和传统方式相比较:

//     UserService user = new UserServiceIml();
//     UserDao dao = new UserDaoImp();
//     ((UserServiceIml)user).setUserDao(dao);
//
//     System.out.println(user.getUser());

    }

}

allbean.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">

    <!--
    此配置文件是spring 元数据的配置文件,根标签为 beans标签。
    在这个标签下可以定义由Spring 管理的 bean,其定义形式如下被注释的地方所示:
    基本的配置包括一个容器全局唯一的字符串id,和一个完全限定的类名。

    但在这个例子中,有两个import标签,分别引入了另外两个 xml元数据配置文件。
    这么做的好处是,不同的 bean定义对应相应的程序体系架构。
  import标签导入的配置文件路径是相对路径,相对于当前文件。

  路径前面可以与斜杠,但不建议这么做。如下示例不推荐使用
      <import resource="/com/test/dao/dao.xml"/>

  类似../的路径也不推荐使用

     -->
    <import resource="com/test/dao/dao.xml"/>

    <import resource="com/test/service/service.xml"/>

    <!--
    <bean id="bean1" class="..."/>
    <bean id="bean2" class="..."/>
     -->

</beans>

Service

Service层包含一个接口,一个实现类,一个Spring的xml元数据配置文件:

如下

/**  

 * 接口
 */
public interface UserService {

    public List<User> getUser();

}
/**
 *实现类,有个字段引用了UserDao接口,其具体的业务逻辑调用  {@link UserDao#getUser()}实现
 *
 *且有一个set方法,此set方法由spring 容器注入使用,如果没有回报错,
 *这是spring容器依赖注入的一种方法--setter注入
 */
public class UserServiceIml implements UserService{

    private UserDao userDao;
    @Override
    public List<User> getUser() {
       return userDao.getUser();
    }
    public void setUserDao(UserDao userDao) {
       this.userDao = userDao;
    }
}

Xml元数据配置如下,它定义了userServicebean,且定义了它的依赖:

<?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">

    <!--
    定义了一个由Spring管理的  id为 user 类型为com.test.service.UserServiceIml 的 bean,
    property 标签用来定义setter 依赖。
   name 属性  定义依赖的名称为  “userDao”(以便通过反射得到seeter方法),此名称和 UserServiceIml 的字段userDao对应。
   ref属性定义此依赖引用了一个名称为 “userDao”的bean (这个bean在dao层定义)
     -->

    <bean id="user" class="com.test.service.UserServiceIml" >
        <property name="userDao" ref="userDao"></property>
    </bean>

</beans>

Dao

Dao层定义了相应的 接口,实现类和 xml元数据配置,首先是接口和实现类:

public interface UserDao {

    public List<User> getUser();

}
public class UserDaoImp implements UserDao{

    @Override
    public List<User> getUser() {
       List<User> res = new ArrayList<User>();
       User a = new User(1, "aa");
       User b = new User(2, "bb");

       res.add(a);
       res.add(b);
       return res;
    }

}

然后是xml配置文件,定义了一个名称为userDao,实现类为com.test.dao.UserDaoImp 的bean:

<?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="userDao" class="com.test.dao.UserDaoImp">
    </bean>

</beans>

输出

运行客户端程序,输入如下,和预期一样:

总结

此文章简单的说明了Spring容器的用法和相关bean的配置。从一个极简单例子入手,自顶向下的进行剖析,并简单的分析了Spring的优点。当然本人目前水平有限,不当之处,欢迎指正。

另外,关于Spring bean的配置还有很多地方需要深入理解,不仅仅是Xml,还有注解、JSR以及他们的组合。bean的配置也包含其他方面,如基本数据类型、集合类型、生命周期、范围、容器扩展点等,而这些都属于spring的核心功能,需要逐步理解掌握,期待大家共同进步。

时间: 2024-10-15 02:56:48

Spring之容器和配置初识的相关文章

介绍 Spring IoC 容器和 bean

简介 本章涵盖了 Spring Framework实现控制翻转 (IoC) 的原则. IoC 有时也被称为依赖注入 (DI).这是一个对象定义他们依赖的过程,其中对象之间的相关性,也就是说,它们一起工作,只能通过构造函数参数,参数工厂方法或设置在其构造后的对象实例或者是从一个工厂方法返回的对象实例的属性上.容器在创建的 bean 注入这些依赖.这个过程是根本的反转,因此称为控制反转(IoC),bean 本身通过直接构造类,或作为 Service Locator(服务定位器)模式的机制,来控制其依

Spring通过JNDI获取在Tomcat容器中配置的C3P0数据源

开始直接使用Spring通过JNDI获取在Tomcat容器中配置的数据源,Tomcat默认的应该是DBCP连接池,没问题,一切OK,由于Hibernate和Spring都推荐使用C3P0连接池,所以就尝试配置一下,没想到整了半下午,才搞定配置,惭愧!网上的内容眼花缭乱,鱼龙混杂,不如自己靠谱!直接上代码,后面附出现的问题! 配置两个地方: 1.Tomcat\conf下的context.xml 2.Spring的配置文件 提示: 1.如果要优化连接池的性能,要对参数进行设置,具体的要看官网!官网最

Spring Java-based容器配置

多年以来,Spring大量的XML配置及复杂的依赖管理饱受非议. 为了实现免XML的开发体验.Spring加入了新的配置注解以支持Java Config开发模式,当中最重要的注解就是@Configuration和@Bean. 基本概念:@Bean和@Configuration 在Spring新的Java-configuration支持中,最核心的部分就是使用@Configuration注解的类和使用@Bean注解的类. @Bean注解用于指示一个方法实例化.配置,初始化一个新的被Spring容器

基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置

经过<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1) - 数据源与事务管理>和<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - 静态资源.视图和消息器>两篇博文的介绍,我们已经配置好了Spring所需的基本配置.在这边博文中,我们将介绍怎么使用这些配置到实际项目中,并将web.xml文件替换为一个Java类. 我们使用Java代码来配置Spring,目的就是使我们的这些配置能够复用,对于这些配置的复用,我们采用继承和引入来实现

[Spring实战系列](6)配置Spring IOC容器的Bean

1. 简介 Spring提供了一个强大的IOC容器来管理组成应用的bean.为了利用容器服务,必须配置运行于Spring IOC容器中的Bean. 2. 解决方案 你可以通过XML文件,属性文件,注释甚至API来设置Spring IOC容器中的Bean. Spring允许你在一个或者多个bean配置文件中配置bean.对于简单的应用程序,可以在单个配置文件中集中配置bean.但是对于有许多bean的大型应用,你应该根据其功能将其分割到多个配置文件中. 3. 创建Spring配置 正如前面所讲的,

Spring Java-based容器配置(二)

### 组装Java-based的配置 * 使用@Import注解 跟在Spring XML文件中使用`<import>`元素添加模块化的配置类似,@Import注解允许你加载其他配置类中的@Bean定义: ```java @Configuration public class ConfigA { @Bean public A a() { return new A(); } } @Configuration @Import(ConfigA.class) public class ConfigB

Spring容器,Bean配置信息,Bean实现类以及应用程序四者的相互关系(看书随笔)

Spring容器,Bean配置信息,Bean实现类以及应用程序四者的相互关系图: Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载\实例化Bean,并建立Bean和Bean的依赖关系,最后将这些准备就绪的Bean放到Bean缓存池中,以供外层的应用程序调用.

java计划任务调度框架quartz结合spring实现调度的配置实例代码分享

点击链接加入群[JavaEE(SSH+IntelliJIDE+Maven)]:http://jq.qq.com/?_wv=1027&k=L2rbHv 一:quartz简介 OpenSymphony 的Quartz提供了一个比较完美的任务调度解决方案. Quartz 是个开源的作业调度框架,定时调度器,为在 Java 应用程序中进行作业调度提供了简单却强大的机制. Quartz中有两个基本概念:作业和触发器.作业是能够调度的可执行任务,触发器提供了对作业的调度 二:quartz spring配置详

关于spring中&lt;context:annotation-config/&gt;配置

在spring的配置文件中,如果我们一个一个地配置bean会非常麻烦,因此我们可以使用注解的方式 使用@Autowired注解,必须事先在Spring容器中声明AutowiredAnnotationBeanPostProcessor的Bean: 使用 @Required注解,就必须声明RequiredAnnotationBeanPostProcessor的Bean 类似地,使用@Resource.@PostConstruct.@PreDestroy等注解就必须声明 CommonAnnotatio