Spring Bean装配

来源:互联网 发布:网络流行红歌 编辑:程序博客网 时间:2024/06/05 13:31

Spring Bean装配

配置

Spring 配置文件的一般结构如下:

<beans>    <import  resource=“resource1.xml” />    <import  resource=“resource2.xml” />    <bean id=“bean1” class=“***”></bean>    <bean name=“bean2” class=“***”></bean>    <alias alias=“bean3” name=“bean2” /></beans>

这里写图片描述

Spring 的配置文件是基于XML格式的,Spring1.0的配置文件采用DTD格式,Spring2.0以后使用Schema的格式,后者让不同类型的配置拥有了自己的命名空间,是配置文件更具有扩展性。

配置文件

applicationContext.xml是spring的默认配置文件

Spring Bean 的实例化 – 构造器实例化
构造器实例化 Bean 是最简单的方式,Spring IoC容器既能使用默认空构造器也能使用有参数构造器两种方式创建Bean,如以下方式指定要创建的Bean类型:

1. 空构造器实例化:<bean id="helloServiceNoWithArgs" class="com.jike.***.HelloWorldImpl" />2. 有参数构造器实例化:<bean id="helloServiceWithArgs" class=" com.jike.***.HelloWorldmpl">    <!-- 指定构造器参数 -->      <constructor-arg index="0" value="Hello Spring!"/>  </bean>

Spring Bean 的实例化 – 静态工厂实例化

使用静态工厂的方式除了指定必须的class属性,还要指定factory-method属性来指定实例化Bean的方法,而且使用静态工厂方法也允许指定方法参数,Spring IoC容器将调用此属性指定的方法来获取Bean,配置如下:

public class HelloWorldStaticFactory {     /**     * 工厂方法      *      * @param message     * @return     */    public static HelloWorld newInstance(String message) {        // 返回需要的Bean实例        return new HelloWorldImpl(message);    }}<!--使用有参数构造参数-->  <bean id="helloServiceStaticFactory" class="com.jike.***.HelloWorldStaticFactory"        factory-method="newInstance">          <!-- 指定构造器参数 -->           <constructor-arg index="0" value="Hello Static Factory!"/>  </bean>

Spring Bean 的实例化 – 实例工厂实例化
使用实例工厂方式不能指定class属性,此时必须使用factory-bean属性来指定工厂Bean,factory-method属性指定实例化Bean的方法,而且使用实例工厂方法允许指定方法参数,方式和使用构造器方式一样,配置如下:

public class HelloWorldInstanceFactory {     /**     * 工厂方法      *      * @param message     * @return     */    public HelloWorld newInstance(String message) {        // 返回需要的Bean实例        return new HelloWorldImpl(message);    }} <!-- 1、定义实例工厂Bean -->    <bean id="beanInstanceFactory" class="com.jike.***.HelloWorldInstanceFactory" />    <!-- 2、使用实例工厂Bean创建Bean -->    <bean id=“helloWorldInstance" factory-bean="beanInstanceFactory"                               factory-method="newInstance">         <constructor-arg index="0" value="Hello  Instance Factory!"></constructor-arg>    </bean>

当用户使用Spring的WebApplicationContext时,还可以使用另外3种Bean的作用域,即request,session和globalSession。在使用Web应用环境相关的Bean作用域时,必须在Web容器中进行一些额外的配置:
低版本Web容器配置:

<filter>      <filter-name>requestContextFilter</filter-name>      <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>  </filter>  <filter-mapping>      <filter-name>requestContextFilter</filter-name>      <servlet-name>/*</servlet-name>  </filter-mapping> 

高版本Web容器配置:

<listener> <listener-class>    org.springframework.web.context.request.RequestContextListener</listener-class></listener>

配置文件的整合
多个配置文件:
Spring-Common.xml位于common文件夹下
Spring-Connection.xml位于connection文件夹下
Spring-Module.xml位于module文件夹下
传统加载方式:

  ApplicationContext context = new ClassPathXmlApplicationContext(new String[]     {"Spring-Common.xml","Spring-Connection.xml","Spring-ModuleA.xml"});

整合配置文件:Spring-All-Module.xml

<beans .....>    <import resource="common/Spring-Common.xml"/>    <import resource="connection/Spring-Connection.xml"/>    <import resource="module/Spring-Module.xml"/></beans>

整合后加载方式:

  ApplicationContext context = new ClassPathXmlApplicationContext(“Spring-All-Module.xml”);

注解装配

Spring是从Spring2.5开始引入使用注解自动装配的。
Spring容器是默认禁用注解装配的,因此如果要使用Spring的注解装配,你必须启用它。启用方式:使用Spring的context命名空间配置中的<context:annotation-config>元素,配置启用如下:

<?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-3.0.xsd          http://www.springframework.org/schema/context           http://www.springframework.org/schema/context/spring-context-3.0.xsd">      <!--           spring默认是禁用注解装配,添加下行代码可启用          spring支持几种不同的用于自动装配的注解          Spring自带的@Autowired          JSR-330的@Inject          JSR-250的@Resource       -->      <context:annotation-config />  </beans>

补充:参考Spring配置项<context:annotation-config/>解释说明

当使用 <context:component-scan/> 后,就可以将 <context:annotation-config/> 移除了。

你可能会见到<context:annotation-config/>这样一条配置,他的作用是式地向 Spring 容器注册
AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessor
PersistenceAnnotationBeanPostProcessor 以及 RequiredAnnotationBeanPostProcessor 这 4 个BeanPostProcessor
注册这4个 BeanPostProcessor的作用,就是为了你的系统能够识别相应的注解


@Component 是Spring容器中的基本注解,表示容器中的一个组件(bean),可以作用在任何层次,下面的示例介绍该注解的使用方法:
注解配置示例

@Component(“userDao”)public   class     UserDao {  ……  }

等效XML配置:

<bean id=“userDao” class=“com.jike.***.UserDao”/>

Spring在2.5后提供了一个context的命名空间,它提供了通过扫描类包来加载利用注解定义的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"                    xmlns:context="http://www.springframework.org/schema/context"    ①                       xsi:schemaLocation="......                             http://www.springframework.org/schema/context/spring-context-3.0.xsd">                   <context:component-scan   base-package="com.jike.spring"/>   ② </beans> 

Spring 自 2.0 开始,陆续引入了一些注解用于简化 Spring 的开发。@Repository 注解便属于最先引入的一批,用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean:

①  使用 @Repository 将 DAO 类声明为 Bean        @Repository        public class UserDaoImpl  implements  UserDao{ …… }  ② 在 XML 配置文件中启动 Spring 的自动扫描功能        <beans … >            <context:component-scan base-package=“com.jike.dao” />            ……       </beans>

Spring 2.5 在 @Repository 的基础上增加了功能类似的额外三个注解,共有如下四种注解:
@Component :一个泛化的概念,表示一个组件 (Bean) ,可作用在任何层次;
@Repository:用于对DAO实现类进行标注;
@Service: 用于对Service实现类进行标注;
@Controller :用于对Controller实现类进行标注;

Aware

Spring中提供了一些以Aware结尾的接口,实现了Aware接口中的bean在被初始化之后,可以获取相应资源。
通过Aware接口,可以对Spring相应资源进行操作。为对Spring进行简单的扩展提供了方便的入口。

public class MoocBeanName implements BeanNameAware, ApplicationContextAware {    private String beanName;    @Override    public void setBeanName(String name) {        this.beanName = name;        System.out.println("MoocBeanName : " + name);    }    @Override    public void setApplicationContext(ApplicationContext applicationContext)            throws BeansException {        System.out.println("setApplicationContext : " + applicationContext.getBean(this.beanName).hashCode());    }}

Bean的自动装配

如果Bean中需要装配的属性过多,那么将这些属性都在XML文件中配置就会有些麻烦,在Spring中允许使用<bean>标签的autowire属性来装配这些属性。

例子AutoWiringDAO如下:

package com.imooc.autowiring;public class AutoWiringDAO {    public void say(String word) {        System.out.println("AutoWiringDAO : " + word);    }}

AutoWiringService中有个AutoWiringDAO类型属性,实现其set方法:

package com.imooc.autowiring;public class AutoWiringService {    private AutoWiringDAO autoWiringDAO;    public AutoWiringService() {    }    public AutoWiringService(AutoWiringDAO autoWiringDAO) {        System.out.println("AutoWiringService");        this.autoWiringDAO = autoWiringDAO;    }    public void setAutoWiringDAO(AutoWiringDAO autoWiringDAO) {        System.out.println("setAutoWiringDAO");        this.autoWiringDAO = autoWiringDAO;    }    public void say(String word) {        this.autoWiringDAO.say(word);    }}

byName

byName:试图在Spring容器中寻找和自动装配的Bean属性名相同的Bean名,如果未找到和属性同名的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"         default-autowire="byName">        <bean id="autoWiringService" class="com.imooc.autowiring.AutoWiringService" ></bean>        <bean id="autoWiringDAO" class="com.imooc.autowiring.AutoWiringDAO" ></bean> </beans>

使用测试类来测试

package com.imooc.test.autowiring;import org.junit.Test;import org.junit.runner.RunWith;import org.junit.runners.BlockJUnit4ClassRunner;import com.imooc.autowiring.AutoWiringService;import com.imooc.test.base.UnitTestBase;@RunWith(BlockJUnit4ClassRunner.class)public class TestAutoWiring extends UnitTestBase {    public TestAutoWiring() {        super("classpath:spring-autowiring.xml");    }    @Test    public void testSay() {        AutoWiringService service = super.getBean("autoWiringService");        service.say(" this is a test");    }}

结果输出为:

setAutoWiringDAOAutoWiringDAO :  this is a test

byType

byType试图在Spring容器中寻找和要装配的Bean属性类型相同或者其子类的Bean。

这样在配置Bean时可以去掉id,可实现一样的效果。

    <bean id="autoWiringService" class="com.imooc.autowiring.AutoWiringService" ></bean>    <bean class="com.imooc.autowiring.AutoWiringDAO" ></bean>

constructor

constructors和byType类似,只是这种方式用来自动装配构造方法。如果某个构造方法的参数都可以在容器中找到同类的Bean,并且不会冲突,那么这个Spring将会自动装配这个构造方法。

<?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"         default-autowire="constructor">        <bean id="autoWiringService" class="com.imooc.autowiring.AutoWiringService" ></bean>        <bean id="autoWiringDAO" class="com.imooc.autowiring.AutoWiringDAO" ></bean> </beans>
0 0
原创粉丝点击