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

关于Spring aspectj加载时编织执行顺序

濮阳奇逸
2023-03-14
@Configurable(preConstruction = false)
public class Mock implements IMock
{

    @Autowired
    private Foo foo;


    public Mock()
    {
        System.out.println("i need foo in the constructor but it is not autowired at this point " + foo);
    }

    @PostConstruct
    public void start()
    {
        System.out.println("starting");
    }
}

当我设置Spring Ashej加载时间编织并通过new关键字创建一个实例时,如下所示(下图)。事实证明,我无法访问构造函数中的依赖项。正如预期的那样,这一切都很好。执行顺序是构造函数-

public class Main
{

    public static void main(String[] args)
    {
        URL url = Main.class.getResource("applicationContext.xml");
        FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext(url.getPath());

        Mock mock = new Mock();
    }
}

所以我设置了可配置(preConstruction=true)。现在,我可以访问构造函数中的依赖项。但问题是执行顺序:autowire-

我误解了什么吗?@PostConstruct的语义学是什么?是“post构造函数”还是“post依赖注入”?我查看了@PostConstruct的javadoc。它没有提到构造函数。

编辑:顺便说一句,以下是我使用的库版本:

Spring方面4.1.6。发布

Spring仪表4.1.6。发布


共有1个答案

谭仰岳
2023-03-14

@PostConstruct在Spring中由Common AnnotationBeanPostProcess处理,并与为给定bean工厂配置并适用于有问题的bean的所有bean配置后处理器一起运行(按照它们配置运行的顺序)。@Configurable注释只是将其他非Spring托管的bean标记为有资格通过Spring进行自动装配和bean后处理,并且是通过AnnotationBean配置后处理完成的。preBuilding=true将指示此配置应该在有关对象的构造函数运行之前发生。这意味着如果preBuild=true,则在运行相关对象的构造函数时,Spring将完成对对象的配置。

太长别读-是的,这是你的情况下事情应该发生的预期顺序。

 类似资料:
  • 但我的问题是,如果它不使用AspectJ进行编织,那么Spring AOP是否有自己的编织,它是在加载时还是编译时执行? 我的Spring配置XML文件的相关部分是:

  • 关于 promise reduce执行顺序 请高手解释下为何p1和p2为什么都是打印1,p1和p2都在runPromiseInSequence之前执行 这是我尝试修改后的代码, 看起来还是比较吃力,求大佬帮我解析一下,问了chatgpt回答的不正确

  • 问题内容: 在HTML页面中包含JavaScript的方法有很多。我知道以下选项: 内联代码或从外部URI加载 包括在或标记[ [1],[2] ] 没有属性或属性(仅外部脚本) 包含在静态源中或由其他脚本动态添加(处于不同的解析状态,具有不同的方法) 不计算硬盘中的浏览器脚本,javascript:URI和-attributes [[3] ],已经有16种方法可以使JS执行,我敢肯定我忘了一些东西

  • 每当打开Hibernate会话时,我都想使用AsheJ添加一个过滤器。我创建了一个方面并为我自己的类测试了它,它起作用了,但是对于Hibernate会话它什么也不做。 我创建了一个META-INF/aop。资源中的xml: 当我开始我的程序时,我得到以下异常: 我遵循了这些教程: 教程1教程2 我发现我必须按照异常的指示传递JVM参数,所以我尝试在构建梯度中执行以下操作: 根据IntelliJ,a

  • 打印2的位置 怎么解释呢