当前位置: 首页 > 知识库问答 >
问题:

spring——使用@Configurable用new运算符创建对象

陶裕
2023-03-14

有可能使用@Configurable类那

我知道用@Autowired和@Resource等是可能的...还有其他的吗?

如。

@Configurable
public Class MyObj{
 @Value("$(my.prop)")
 private String aField;

 public String getAField(){
   return aField;
 }
}

然后像这样

public aMethodSomewhereElse(){
   MyObj obj = new MyObj()
   assertNotNull(obj.getAField());
}

除了能够使用<code>new</code>操作符创建<code>MyObj</code>并仍然让spring处理注释之外,还有其他选择吗?

——编辑:

在使用@Autowired时,可以使用new来做到这一点,看看一些带有Spring和AOP的Hibernate和JPA的东西...我过去曾用它来分析Java代码。但是我真的想使用SPEL和@Value,然后再模拟一个完整的例子,我希望在这里找到答案。仅供参考 - 如果你不相信我,Spring手册甚至说可以做到这一点,我想知道的是,是否有可能在同一范围内使用@Value注释......

Spring容器实例化并配置应用程序上下文中定义的beans。给定包含要应用的配置的bean定义的名称,也可以要求bean工厂配置预先存在的对象。jar包含一个注释驱动的方面,它利用这种能力允许任何对象的依赖注入。

当然,单独使用注释没有任何作用。spring-aspects.jar中的AnnotationBeanConfigurerAspect对注释的存在起作用。本质上,这个方面说“从一个用@Configurable注释的类型的新对象的初始化返回后,根据注释的属性使用Spring配置新创建的对象”。在此上下文中,初始化指的是新实例化的对象(例如,用“new”运算符实例化的对象)以及正在进行反序列化(例如,通过readResolve())的可序列化对象。

http://static.springsource.org/spring/docs/3.0.0.RC2/reference/html/ch07s08.html

干杯。

共有3个答案

习狐若
2023-03-14

我不认为可以使用新的运算符并要求Spring自动连接属性。我认为解决这个问题的一种方法是获取对 applicationContext 的静态引用,并创建一个原型作用域的 Bean。

@Component
public class ApplicationContextLocator {
    private static ApplicationContext applicationContext;

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public ApplicationContextLocator() {
        super();
    }

    @Autowired
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ApplicationContextLocator.applicationContext = applicationContext;
    }

}

@Scope(BeanDefinition.SCOPE_PROTOTYPE)
@Component
public class MyObj {
    .....
}

public aMethodSomewhereElse(){
   MyObj obj = ApplicationContextLocator.getApplicationContext().getBean(MyObj.class)
   assertNotNull(obj.getAField());
}
卢翔宇
2023-03-14

MyObj obj = new MyObj()

意味着obj不受spring管理,所以它不会进行自动连接。唯一方法是从应用程序上下文中获取实例。例如:

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
MyObj obj = context.getBean("myBean");
蒋正平
2023-03-14

你是绝对正确的 - @Autowired字段将连接到一个@Configurable注释的类中,即使在Spring容器之外,假设你有一个AspectJ基础设施。

不过,您已经注意到一个很好的捕获,@Value字段由Spring Bean后处理器(AutowiredAnnotationBeanPostProcessor)处理,该处理器解析带注释的字段@Value。它不会作用于在容器外部实例化的对象 - 所以简而言之,@Autowired字段应该连接,但@Value属性不会。

 类似资料:
  • 返回前用调试器运行程序时,指针的值为0x0000000009DFAA90,但的值变为0x0000000009DFAA98。 这种情况只发生在字符串类型中。我试着对我的一个类的“int[10]”、“string*[10]”和对象做同样的操作,但问题只发生在处理string和代码时: 工作非常好。 有没有人能解释一下为什么会发生这种情况,以及如何使它正常工作? PS:我们正在使用Visual Stud

  • 问题内容: 我看到过这样创建的对象: 但是我认为创建对象时括号不是可选的: 创建对象的前一种方法在ECMAScript标准中是否有效并定义?前一种创建对象的方式与后一种创建方式之间有什么区别吗?是一个比另一个更好的选择吗? 问题答案: 引用David Flanagan 1: 作为一种特殊情况,仅对于运算符,JavaScript通过在函数调用中没有参数的情况下允许省略括号来简化语法。以下是使用运算符

  • 我知道字符串文字和新字符串对象之间的区别,也知道它在内部是如何工作的。但我的问题是,这有点超前。当我们使用new关键字as创建字符串对象时 在本例中,我们传递的是字符串类型的参数。我的问题是这个字符串是在哪里生成的-堆还是字符串常量池还是其他地方? 据我所知,这个参数是一个字符串文字,所以它应该在字符串常量池中。如果是这样的话,那么intern方法的用途是什么?只需将变量str链接到常量池?因为“

  • 本文向大家介绍详解C++中new运算符和delete运算符的使用,包括了详解C++中new运算符和delete运算符的使用的使用技巧和注意事项,需要的朋友参考一下 C++ 支持使用 new 和 delete 运算符动态分配和释放对象。这些运算符为来自称为“自由存储”的池中的对象分配内存。 new 运算符调用特殊函数 operator new,delete 运算符调用特殊函数 operator de

  • 想改进这个问题吗 通过编辑此帖子,更新问题,使其只关注一个问题。 我正在学习Spring并构建一些实验应用程序。我不知道在哪里使用@Autowired来创建对象。 我得到了它促进松散耦合的部分,并且每次都创建一个新的对象,而不是“new”关键字所做的。 但是,对于我们需要在应用程序中使用的第三方对象,我们应该做些什么呢。例如,我正在使用一个rest API,为此我需要初始化三个类,如下所示 这段代

  • 我发现了很多关于如何克服此限制的帖子,但没有一个关于为什么存在此限制的帖子(除了这个,它只是提到它与类型擦除有关)。 那么,为什么不能创建泛型类型的实例呢? 澄清一下,我的问题不是如何做到这一点。我知道这在C#中是可能的,那么为什么不在Java呢?我很好奇为什么Java没有实现类似的机制?为什么强迫Java开发人员使用可能导致运行时错误的笨拙变通方法?这种机制有什么潜在的危险吗?