`

spring autowire="byName" 注入属性

阅读更多

byName 根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自
动装配。例如,在bean定义中将 autowire设置为by name,而该bean包含master属性(同时提供
setMaster(..)方法),Spring就会查找名为master的bean定义,并用它来装配给master属性。

比如配置文件里面有如下配置

<bean id="userInfoService" class="com.mobile.base.core.thrift.client.ThriftClientFactoryBean" autowire="byName">
        <property name="className" value="com.thrift.live.UserInfoService"/>
    </bean>

 

ThriftClientFactoryBean 类如下:

 

package com.mobile.base.core.thrift.client;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;

public class ThriftClientFactoryBean implements FactoryBean, InitializingBean {
    private Class ifaceClass;
    private Class clientClass;

    private String className;
    private ThriftClient thriftClient;

    public void setClassName(String className) {
        this.className = className;
    }

    public void setThriftClient(ThriftClient thriftClient) {
        this.thriftClient = thriftClient;
    }

    @Override
    public Object getObject() throws Exception {
        return Proxy.newProxyInstance(clientClass.getClassLoader(), clientClass.getInterfaces(), new ThriftProxy(thriftClient, className));
    }

    @Override
    public Class<?> getObjectType() {
        return ifaceClass;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        ifaceClass = Class.forName(className + "$Iface");
        clientClass = Class.forName(className + "$Client");
    }

    class ThriftProxy implements InvocationHandler {
        private ThriftClient thriftClient;
        private String className;

        public ThriftProxy(ThriftClient thriftClient, String className) {
            this.thriftClient = thriftClient;
            this.className = className;
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            //modified by jesseling at 2015-3-12 to add detail of exception
            try {
                return method.invoke(thriftClient.get(className), args);
            } catch (InvocationTargetException e) {
                throw e.getCause();
            } catch (Exception e){
                throw e.getCause();
            } 
        }
    }
}

 有个属性叫thriftClient,并且有setThriftClient方法。

Spring 容器在实例化com.mobile.base.core.thrift.client.ThriftClientFactoryBean的时候,bean名字叫userInfoService,因为有autowire="byName",所以spring 会在容器里面找一个叫thriftClient的 bean,并把它注入到ThriftClientFactoryBean的属性里面(类似@Autowired),前提是ThriftClientFactoryBean有setThriftClient方法,并且spring容器里面有个bean叫ThriftClient,如下:

 

<bean id="thriftClient" class="com.mobile.base.core.thrift.client.ThriftClient" >
   	</bean>

 

如果把autowire="byName" 去掉,或者没有setThriftClient方法,spring在实例化ThriftClientFactoryBean的时候,都不会注入thriftClient这个属性。

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    spring 属性参考与自动绑定

    当`autowire`属性设置为`byName`时,Spring会尝试根据属性名和bean的ID来自动匹配bean。这意味着如果有一个bean的ID与属性名相匹配,那么这个bean将会被注入到对应的属性中。例如: ```xml &lt;bean id="date" class=...

    Spring的三种注入方式

    2.autowire=“byName”  3.autowire=bytype    详细解析注入方式  例如:有如下两个类需要注入  第一个类: 1.package org.jia;  2.  3. public class Order {  4. private String orderNum;...

    spring-autowire-demo.zip

    本示例"spring-autowire-demo.zip"是基于Spring 5.3.6版本,通过多个示例展示了自动装配的不同方式:default、byName、byType和constructor,帮助我们更深入理解这个功能。 首先,让我们了解什么是自动装配。自动...

    4.Spring应用扩展.pptx

    可以通过设置`&lt;bean&gt;`元素的`autowire`属性来启用自动装配,如`autowire="byType"`或`autowire="byName"`。此外,也可以使用`@Autowired`注解来精确控制哪些属性需要自动装配。这种方式减少了手动配置的工作量,提高...

    Spring中XML配置的12个技巧

    此外,还可以设置`autowire="byName"`或`autowire="byType"`来指定自动装配模式,或者使用`autowire="autodetect"`让Spring自行决定最合适的自动装配方式。 - **示例代码**:例如,一个名为`OrderService`的bean...

    Spring中自动装配的4种方式

    byName 自动装配是指通过设置 property 标签的 autowire 属性为 byName,Spring 将自动寻找一个与该属性名称相同或 id 相同的 Bean,注入进来。例如: ```xml &lt;bean id="dataSource" class=...

    Spring实现自动装配

    在XML配置中,可以使用`autowire="byName"`开启此功能。 4. **基于注解的自动装配(Annotation-Based Auto-Wiring)**:使用`@Autowired`注解在字段、构造函数、方法或参数级别来指示Spring进行自动装配。默认也是...

    pring自动装配方式介绍共2页.pdf.zip

    2. **byName**:在XML配置中,通过设置`autowire="byName"`,Spring会尝试寻找与当前Bean的属性名相同的Bean,并将其注入。例如,如果一个Bean有一个名为`dataSource`的属性,Spring会查找名为`dataSource`的Bean并...

    Spring自动装配模式表

    当设置自动装配模式为`byName`时,Spring容器会尝试根据Bean的属性名称来查找具有相同ID或name的其他Bean,并将其作为依赖注入到当前Bean中。这种方式适用于属性名称和依赖Bean的ID或name一致的情况。 **优点**: -...

    java开发工具文档

    `byName`方式是根据属性名查找相同id的bean进行注入,而`byType`则是根据属性类型寻找匹配的bean。例如,如果我们有以下XML配置: ```xml &lt;bean id="order" class="org.jia.Order" autowire="byName"/&gt; &lt;bean id...

    配置后的spring讲解

    8. **自动装配**:Spring提供了autowire属性,如`autowire="byName"`或`autowire="byType"`,用于自动匹配并注入Bean的依赖。 9. **工厂方法**:如果希望使用自定义的工厂方法创建Bean,可以设置`factory-bean`和`...

    spring配置.txtspring配置.txt

    这里将`autowire`属性设置为`byName`,意味着Spring框架将尝试自动装配与bean名称匹配的其他bean。 ### 小结 通过对给定文件的分析,我们了解了Spring框架中XML配置的基本用法,包括如何配置`...

    Spring中XML配置文件的十二个最佳方法.doc

    例如,通过`autowire="byName"`或`autowire="byType"`,Spring会根据属性名或类型自动匹配依赖。然而,这种方式容易引发误导,因为当项目变得复杂时,自动绑定可能造成难以追踪的依赖关系。因此,推荐明确地定义bean...

    马士兵Spring,XML部分整理

    默认情况下,`autowire="byName"`是按名称自动装配,而`autowire="byType"`则是按类型自动装配。`@Qualifier("u")`注解用于指定特定的Bean名称。 5. **XML约束(XSD)**:XML配置文件通常需要引用Spring的XSD文件,...

    Spring总结.txt

    - **`autowire`属性**:Spring还支持自动装配机制,通过设置`autowire`属性为`byName`或`byType`来自动匹配Bean。 - `byName`:按照Bean名称进行匹配。 - `byType`:按照Bean类型进行匹配。 例如: ```xml ...

    autowire自动导入句柄

    - **byName**:根据bean属性的名称来寻找匹配的bean进行自动装配。 - **byType**:根据bean属性的类型来寻找匹配的bean进行自动装配。 - **constructor**:通过构造函数参数的类型来寻找匹配的bean,然后通过构造...

    Spring考试.doc

    - Spring中有两种主要的装配模式:按类型装配(byType)和按名称装配(byName)。 - 默认情况下,Spring并不会自动装配bean,需要在配置中明确指定,例如`default-autowire="byType"`。 - `default-autowire`属性...

Global site tag (gtag.js) - Google Analytics