GVKun编程网logo

Spring之Bean配置(spring bean配置)

31

以上就是给各位分享Spring之Bean配置,其中也会对springbean配置进行解释,同时本文还将给你拓展Spring3.x中三种Bean配置方式比较详解、Springbean配置基于注解的方式注

以上就是给各位分享Spring之Bean配置,其中也会对spring bean配置进行解释,同时本文还将给你拓展Spring 3.x中三种Bean配置方式比较详解、Spring bean配置基于注解的方式注入、Spring Bean配置等同于、Spring Bean配置默认为单实例 pring Bean生命等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Spring之Bean配置(spring bean配置)

Spring之Bean配置(spring bean配置)

    Java实例的属性值可以有很多种数据类型、基本类型值、字符串类型、java实例甚至其他的Bean实例、java集合、数组等。所以Spring允许通过如下几个元素为Bean实例的属性指定值:

          value

          ref

          bean

          list、set、map、props

 一、value:设置普通属性值

        <value.../>元素用于指定字符串类型、基本类型的属性值。Spring使用XML解析器来解析出这些数据,然后利用java.beans.PropertyEdior完成类型转换:从java.lang.String类型转换为所需的参数值类型。如果目标类型是基本数据类型,通常都是可以正确转换。

public class ValueTest {
    //定义一个String型属性
    private String name;
    //定义一个int型属性
    private int age;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

上面实例只是演示了注入普通属性值。在Spring配置文件中使用<value.../>元素来为这两个属性指定属性值。

1 <bean id="text">
2         <property name="age" value="1" />
3         <property name="name" value="chenssy" />
4     </bean>

  通过上面可以知道<value.../>元素主要用于传入字符串、基本类型的属性值。

二、ref:配置合作者

        <value.../>主要是配置基本类型的属性值,但是如果我们需要为Bean设置属性值是另一个Bean实例时,这个时候需要使用<ref.../>元素。使用<ref.../>元素可以指定如下两个属性。

          bean:引用不在同一份XML配置文件中的其他Bean实例的id属性值。

          local:引用同一份XML配置文件中的其他Bean实例的id属性值。

<bean id="steelAxe"></bean>
    <bean id="chinese">
        <property name="axe">
            <ref local="steelAxe"/>
        </property>
    </bean>

或者

1 <bean id="steelAxe"></bean>
2     <bean id="chinese">
3         <property name="axe" ref="steelAxe" />
4     </bean>

通过property增加ref属性,一样可以将另一个Bean的引用设置成axe属性值。这样写的效果和使用<ref.../>属性一样,而且不需要区分是使用bean属性还是local属性,所以推荐这种写法。

使用自动装配注入合作者bean

 Spring支持自动装配Bean与Bean之间的依赖关系,也就是说我们无需显示的指定依赖Bean。由BeanFactory检查XML配置文件内容,根据某种规则,为主调Bean注入依赖关系。

Spring的自动装配机制可以通过<bean.../>元素的default-autowire属性指定,也可以通过<bean.../>元素的autowire属性指定。

          自动装配可以减少配置文件的工作量,但是它降低了依赖关系的透明性和清晰性,所以一般来说在较大部署环境中不推荐使用,显示配置合作者能够得到更加清晰的依赖关系。Spring提供了如下几种规则来实现自动装配。

          no:不适用自动装配。Bean依赖必须通过ref元素定义。

          byName:根据属性名自动装配。BeanFactory查找容器中的全部Bean,找出其中id属性与属性同名的Bean来完成注入。如果没有找到匹配的Bean实例,则Spring不会进行任何注入。

          byType:根据属性类型自动装配。BeanFactory查找容器中的全部Bean,如果正好有一个与依赖属性类型相同的Bean,就自动注入这个属性;但是如果有多个这样的Bean,就会抛出一个异常。如果没有匹配的Bean,则什么都不会发生,属性就不会被设置。如果需要无法自动装配时抛出异常,则设置dependency-check=”objects”。

          constructor:与不Type类似,区别是用于构造注入的参数。

          Autodetect:BeanFactory根据Bean内部结构,决定使用constructor或者byType。如果找到一个默认的构造函数,则使用byTe。

           

1.byName规则

          byTyep规则是指通过名字注入依赖关系,假如Bean A的实现类里面包含setB()方法,而Spring的配置文件恰好包含一个id为b的Bean,则Spring容器就会将b实例注入Bean A中。如果容器中没有名字匹配的Bean,Spring则不会做任何事情。

1 <bean id="chinese"autowire="byName" />
2     <bean id="gundog">
3         <property name="name" value="wangwang" />
4     </bean>

上面的配置文件指定了byName规则。则com.app.service.impl.Chinese类中提供如下的依赖注入方法:

/*
     * 依赖关系必须的setter方法,因为需要通过名字自动装配
     * 所以setter方法必须提供set+Bean名,Bean名的首字母大写
     * @param dog 设置的dog值
     */
    public void setGundog(Dog dog){
        this.dog = dog;
    }

2.byType规则

          byType规则是根据类型匹配注入依赖关系。假如A实例有setB(B b)方法,而Spring配置文件中恰好有一个类型B的Bean实例,容器为A注入类型匹配的Bean实例。如果容器中存在多个B的实例,则会抛出异常,如果没有B实例,则不会发生任何事情。

1 <bean id="chinese"autowire="byType" />
2     <bean id="gundog">
3         <property name="name" value="wangwang" />
4     </bean>

 针对上面的配置文件Chinese类有如下方法。

/**
     * 依赖关系必须的setter方法
     * 因为使用按类型自动装配,setter方法的参数类型与容器的Bean的类型相同
     * 程序中的Gundog实现了Dog接口
     * @param dog传入的dog对象
     */
    public void setDog(Dog dog){
        this.dog = dog;
    }

 当一个Bean即使用自动装配依赖,又使用ref显示依赖时,则显示指定的依赖就会覆盖自动装配。

          在默认的情况下,Spring会自动搜索容器中的全部Bean,并对这些Bean进行判断,判断他们是否满足自动装配的条件,如果满足就会将该Bean注入目标Bean实例中。如果我们不想让Spring搜索容器中的全部Bean,也就是说,我们需要Spring来判断哪些Bean需要搜索,哪些Bean不需要搜索,这个时候就需要用到autowire-candidate属性。通过为<bean.../>元素设置autowire-candidate=”false”,即可将该Bean限制在自动装配范围之外,容器在查找自动装配对象时将不考虑该Bean。

 

          三、Bean:注入嵌套Bean

          如果某个Bean所依赖的Bean不想被Spring容器直接访问,则可以使用嵌套Bean。<bean.../>元素用来定义嵌套Bean,嵌套Bean只对嵌套它的外部Bean有效,Spring容器无法直接访问嵌套Bean,因此在定义嵌套Bean时是无需指定id属性的。

<bean id="chinese"autowire="byName">
        <property name="axe">
            <!-- 
                属性值为嵌套Bean,嵌套Bean不能由Spring容器直接访问,
                所以嵌套Bean是不需要id属性
             -->
            <bean/>
        </property>
    </bean>

 采用上面的配置可以保证嵌套Bean不能被容器访问,因此不用担心其他程序修改嵌套bean。但是嵌套Bean限制了Bean的访问,提高了程序的内聚性。

 

          四、list、set、map、props

          <value.../>元素是注入基本数据类型和String类型的,但是如果某个Bean的属性是集合呢?这个时候我们就需要使用集合元素,<list.../>、<set.../>、<map.../>和<props.../>元素分别用来设置类型list、set、map和Properties的集合属性值。

          先看下面java类:

public class Chinese implements Person{

    //下面是一系列的集合属性
    private List<String> schools;
    private Map scores;
    private Map<String, Axe> phaseAxes;
    private Properties health;
    private Set axe;
    private String[] books;
    
    public List<String> getSchools() {
        return schools;
    }

    public void setSchools(List<String> schools) {
        this.schools = schools;
    }

    public Map getScores() {
        return scores;
    }

    public void setScores(Map scores) {
        this.scores = scores;
    }

    public Map<String, String> getPhaseAxes() {
        return phaseAxes;
    }

    public void setPhaseAxes(Map<String, String> phaseAxes) {
        this.phaseAxes = phaseAxes;
    }

    public Properties getHealth() {
        return health;
    }

    public void setHealth(Properties health) {
        this.health = health;
    }

    public Set getAxe() {
        return axe;
    }

    public void setAxe(Set axe) {
        this.axe = axe;
    }

    public String[] getBooks() {
        return books;
    }

    public void setBooks(String[] books) {
        this.books = books;
    }

    public void useAxe() {
        
    }

}

    上面的java代码中有数组、list、set、,map、Properties。下面是针对上面的配置文件。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <!-- 定义一个普通的Axe Bean -->
    <bean id="steelAxe"/>
    <bean id="stoneAxe"/>
    
    <!--定义Chinese Bean -->
    <bean id="chinese">
        <property name="schools">
            <list>
                <value>小学</value>
                <value>中学</value>
                <value>大学</value>
            </list>
        </property>
        
        <property name="scores">
            <map>
                <entry key="语文" value="88" />
                <entry key="数学" value="87" />
                <entry key="外语" value="88" />
            </map>
        </property>
        
        <property name="phaseAxes">
            <map>
                <entry key="原始社会" value-ref="stoneAxe" />
                <entry key="农业社会" value-ref="steelAxe" />
            </map>
        </property>
        
        <property name="health">
            <props>
                <prop key="血压">正常</prop>
                <prop key="身高">175</prop>
            </props>
        </property>
        
        <property name="axe">
            <set>
                <value>普通字符串</value>
                <bean></bean>
                <ref local="stoneAxe"/>
            </set>
        </property>
        
        <property name="books">
            <list>
                <value>java 编程思想</value>
                <value>思考致富</value>
                <value>将才</value>
            </list>
        </property>
    </bean>
</beans>

 从上面的配置文件中可以看出,Spring对list属性和数组属性的处理是一样的。

当我们使用<list.../>、<set.../>、<map.../>等元素配置集合属性时,我们还需要手动配置集合元素。由于集合元素又可以是基本类型值、引用容器中的其他Bean、嵌套Bean和集合属性等。所以这些元素又可以接受如下子元素:

          value:指定集合元素是基本数据类型或者字符类型值。

          ref:指定集合元素师容器中另一个Bean实例。

          bean:指定集合元素是一个嵌套Bean。

          list、set、map、props:指定集合元素值又是集合。

Spring 3.x中三种Bean配置方式比较详解

Spring 3.x中三种Bean配置方式比较详解

以前Java框架基本都采用了XML作为配置文件,但是现在Java框架又不约而同地支持基于Annotation的“零配置”来代替XML配置文件,Struts2、Hibernate、Spring都开始使用Annotation来代替XML配置文件了;而在Spring3.x提供了三种选择,分别是:基于XML的配置、基于注解的配置和基于java类的配置。

下面分别介绍下这三种配置方式;首先定义一个用于举例的JavaBean。

package com.chinalife.dao  
public class LoginUserDao {
	……  
	  // 用于设置初始化方法  
	public void myInit() {
	}
	// 用于设置销毁方法  
	public void myDestroy() {
	}
}

一、 基于XML的配置

<bean id=“loginUserDao” class=“com.chinalife.dao.impl.LoginUserDaoImpl” 
    lazy-init=“true” init-method=“myInit” destroy-method=“myDestroy” 
    scope=“prototype”> 
    ……  
</bean> 

在XML配置中,通过<bean></bean>来定义Bean,通过id或name属性定义Bean的名称,如果未指定id和name属性,Spring则自动将全限定类名作为Bean的名称。通过<property>子元素或者p命名空间的动态属性为Bean注入值。还可以通过<bean>的init-method和destory-method属性指定Bean实现类的方法名来设置生命过程方法(最多指定一个初始化方法和销毁方法)。通过<bean>的scope指定Bean的作用范围。听过<bean>的lazy-init属性指定是否延迟初始化。

当Bean的实现类来源于第三方类库,比如DataSource、HibernateTemplate等,无法在类中标注注解信息,只能通过XML进行配置;而且命名空间的配置,比如aop、context等,也只能采用基于XML的配置。

二、基于注解的配置

@Scope(“prototype”)  
@Lazy(true)  
@Component(“loginUserDao”)  
public class LoginUserDao {  
  ……  
  // 用于设置初始化方法  
  @postconstruct 
  public void myInit() {  
 
  }  
 
  // 用于设置销毁方法  
  @PreDestroy 
  public void myDestroy() {  
  }  
}  

在Bean实现类中通过一些Annotation来标注Bean类:

・@Component:标注一个普通的SpringBean类(可以指定Bean名称,未指定时默认为小写字母开头的类名)

・@Controller:标注一个控制器类

・@Service:标注一个业务逻辑类

・@Repository:标注一个DAO类

通过在成员变量或者方法入参处标注@Autowired按类型匹配注入,也可以使用@Qualifier按名称配置注入。通过在方法上标注@PostConstrut和PreDestroy注解指定的初始化方法和销毁方法(可以定义任意多个)。通过@Scope(“prototype”)指定Bean的作用范围。通过在类定义处标注@Lazy(true)指定Bean的延迟加载。

当Bean的实现类是当前项目开发的,可以直接在java类中使用基于注解的配置,配置比较简单。

三、基于java类配置

@Configuration 
public class Conf {  
  @Scope(“prototype”)  
  @Bean(“loginUserDao”)  
  public LoginUserDao loginUserDao() {  
    return new LoginUserDao();  
  }  
}  

在标注了@Configuration的java类中,通过在类方法标注@Bean定义一个Bean。方法必须提供Bean的实例化逻辑。通过@Bean的name属性可以定义Bean的名称,未指定时默认名称为方法名。在方法处通过@Autowired使方法入参绑定Bean,然后在方法中通过代码进行注入;也可以调用配置类的@Bean方法进行注入。通过@Bean的initMethod或destroyMethod指定一个初始化或者销毁方法。通过Bean方法定义处标注@Scope指定Bean的作用范围。通过在Bean方法定义处标注@Lazy指定Bean的延迟初始化。

当实例化Bean的逻辑比较复杂时,则比较适合基于java类配置的方式。

总结

以上就是本文关于Spring 3.x中三种Bean配置方式比较详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Spring bean配置基于注解的方式注入

Spring bean配置基于注解的方式注入

spring2.5提供了基于注解(Annotation-based)的配置,我们可以通过注解的方式来完成注入依赖。在Java代码中可以使用 @Resource或者@Autowired注解方式来经行注入。虽然@Resource和@Autowired都可以来完成注入依赖,但它们之间是有区 别的。

首先来看一下:

 a) @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入;

 b) @Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualifier一起使用;

c) @Resource和@Autowired都可以书写标注在字段或者该字段的setter方法之上

2、使用注解的方式,我们需要修改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"
    xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-2.5.xsd">
               
   <context:annotation-config/>
     
</beans>

3、修改以上配置文件的头信息后,我们就可以在Java代码通过注解方式来注入bean,看下面代码

(1)@Resource

public class StudentService3 implements IStudentService {
    // @Resource(name="studentDao")放在此处也是可行的
    private IStudentDao studentDao;

    private String id;

    public void setId(String id) {
        this.id = id;
    }

    @Resource(name = "studentDao")
    // 通过此注解完成从spring配置文件中查找名称为studentDao的bean来装配字段studentDao,
    //如果spring配置文件中不存在
    // studentDao名称的bean则转向按照bean类型经行查找
    public void setStudentDao(IStudentDao studentDao) {
        this.studentDao = studentDao;
    }

    public void saveStudent() {
        studentDao.saveStudent();
        System.out.print(",ID 为:" + id);
    }

}

配置文件添加如下信息

<bean id="studentDao"></bean>
<bean id="studentService3"/>

(2)@Autowired

public class StudentService3 implements IStudentService {
        // @Autowired放在此处也是可行的
        private IStudentDao studentDao;

        private String id;

        public void setId(String id) {
            this.id = id;
        }

        @Autowired
        // 通过此注解完成从spring配置文件中 查找满足studentDao类型的bean
        // @Qualifier("studentDao")则按照名称经行来查找转配的
        public void setStudentDao(IStudentDao studentDao) {
            this.studentDao = studentDao;
        }

        public void saveStudent() {
            studentDao.saveStudent();
            System.out.print(",ID 为:" + id);
        }
    }

配置文件添加如下信息

<bean id="studentDao"></bean>
<bean id="studentService3"/>

注:在java代码中可以使用@Autowire或者@Resource注解方式进行装配,这两个注解的区别是:


@Autowire 默认按照类型装配,默认情况下它要求依赖对象必须存在如果允许为null,可以设置它required属性为false,如果我们想使用按照名称装配,可 以结合@Qualifier注解一起使用;


@Resource默认按照名称装配,当找不到与名称匹配的bean才会按照类型装配,可以通过name属性指定,如果没有指定name属 性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找 依赖对象.

注意:如果没有指定name属性,并且按照默认的名称仍然找不到依赖的对象时候,会回退到按照类型装配,但一旦指定了name属性,就只能按照名称 装配了.

建议:  @Resource注解是又J2EE提供,而@Autowired是由spring提供,故减少系统对spring的依赖建议使用@Resource的方式;

Spring Bean配置等同于

Spring Bean配置等同于

试图弄清楚@BeanXML元素的等效配置是什么

<mvc:view-controller path="..." />

谢谢!

Spring Bean配置默认为单实例 pring Bean生命

Spring Bean配置默认为单实例 pring Bean生命

Bean默认的是单例的.

如果不想单例需要如下配置:
<bean id="user"singleton="false"/>

singleton就是配置这个bean是否是单例的,如果不写,就是默认值true。

注解:

spring Bean生命周期

1.Bean的作用域可以通过Bean标签的scope属性进行设置,Bean的作用域包括:
默认情况下scope="singleton",那么该Bean是单例,任何人获取该Bean实例的都为同一个实例;
scope="prototype",任何一个实例都是新的实例;
scope="request",在WEB应用程序中,每一个实例的作用域都为request范围;
scope="session",在WEB应用程序中,每一个实例的作用域都为session范围;

注意:在默认情况下,Bean实例在被Spring容器初始化的时候,就会被实例化,默认调用无参数的构造方法。在其它情况下,Bean将会在获取实例的时候才会被实例化。

2.Bean可以通过指定属性init-method指定初始化后执行的方法,以及通过指定属性destroy-method销毁时执行的方法。

语法:<bean ....    destroy-method="销毁时调用的方法名" init-method="初始化后执行的方法名"/>

参考:http://blog.sina.com.cn/s/blog_6151984a0100kfi5.html


今天关于Spring之Bean配置spring bean配置的介绍到此结束,谢谢您的阅读,有关Spring 3.x中三种Bean配置方式比较详解、Spring bean配置基于注解的方式注入、Spring Bean配置等同于、Spring Bean配置默认为单实例 pring Bean生命等更多相关知识的信息可以在本站进行查询。

本文标签: