Java @autowiredbytype能否生成bean定义?

Java @autowiredbytype能否生成bean定义?,java,spring,autowired,Java,Spring,Autowired,当您在spring@组件中使用@Autowired时,spring会为组件的每个实例化确定Autowired候选者,当您使用@Request/@Session作用域的web内容时,这确实不好。为什么spring不在ApplicationContext中创建一个bean定义并重用它呢?有什么方法可以做到这一点吗?是:当您将范围设置为其他内容时(即,您不能使用原型、会话或请求),Spring将重用该组件。所以诀窍是使用两个bean:一个拥有所有不变的东西。还有一个连接到会话/请求的bean,它只有一

当您在spring@组件中使用@Autowired时,spring会为组件的每个实例化确定Autowired候选者,当您使用@Request/@Session作用域的web内容时,这确实不好。为什么spring不在ApplicationContext中创建一个bean定义并重用它呢?有什么方法可以做到这一点吗?

是:当您将范围设置为其他内容时(即,您不能使用原型、会话或请求),Spring将重用该组件。所以诀窍是使用两个bean:一个拥有所有不变的东西。还有一个连接到会话/请求的bean,它只有一个依赖项:第一个bean

Spring不能为您做到这一点,因为当bean足够“静态”时没有规则——作为开发人员,您必须确定这一点

[编辑]您必须在DAO/服务bean中收集bean的静态部分(那些不会随时间变化的部分)。然后在
@组件中使用该bean进行一次查找

若要加快查找速度,请将名称附加到组件。对于基于类型的查找,Spring必须迭代整个上下文(因为几个bean可以匹配),而基于名称/ID的查找只是一个映射中的查找


要给bean命名,请在
@Context
中指定它,或者使用
@bean(name=“name”)
。要从上下文中告诉Spring要使用哪个bean,请使用
@Resource(name)
@Qualifier(“businessObject”)

最佳实践是使用服务类、组件、,DAO等作为单例,并且在应用程序上下文中只有一个实例。@组件注释导致在组件扫描过程中只找到instance,这意味着它们是spring上下文中自动扫描和活动实例的候选对象。 例如:

@Component
public class StudentDAO {
        @Override
        public String toString() {
                return " inside StudentDAO";
        }
}

StudentDAO是一个数据访问对象,在最佳实践中,上下文中不需要此服务CALS的多个实例。它基本上是一个服务类。这是单身人士的完美选择。如果只有这个对象的一个实例,那么自动连接也可以有效地工作8-。但是您仍然必须注意对单例方法的访问,并决定将您的方法标记为已同步,以防止线程产生未消除的影响

AutowiredNotationBeanPostProcessor
是一个
BeanPostProcessor
,而不是一个
BeanPactoryPostProcessor
,因此它无法按设计编辑Bean定义。以不同的方式实现这一点会破坏预期的功能:

public class MyBean{

    @Autowired(required=false)
    public void setOtherBean(OtherBean o){this.otherBean=o;}
    private OtherBean otherBean;

}
如果没有可用的
OtherBean
实例,则不会连接任何实例,但一旦一个实例可用(我可以通过编程轻松地连接一个实例),下一个
MyBean
实例(如果作用域不是单例)将获得新的
OtherBean
(以前不可用)


我并不是说这是我以前遇到过的一个用例,但这是一个有效的用例,如果事情按照您建议的方式运行,它就会崩溃。

手动替代方法是将一个单例范围的
提供者
注入到您的bean中,它提供了原型范围的bean


这意味着程序员要做更多的工作,但是性能的影响将被消除。

在请求/会话范围的bean上设置@Scope注释的proxyMode属性。Spring将创建一个自动连接的代理——代理将查找在其上调用方法的实际bean

我确信当附加到另一个问题时,这个答案看起来不错。@krosenvoid不,我想说这是这个问题的最佳答案(+1)虽然我不喜欢你描述的设计或用例,但它回答了我的问题;)@krosenvoid我也不喜欢它,但它仍然有效:-)