Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java spring使用的代理模式_Java_Spring_Proxy - Fatal编程技术网

Java spring使用的代理模式

Java spring使用的代理模式,java,spring,proxy,Java,Spring,Proxy,我在学春天:) 我有以下疑问: spring是否为每个bean创建代理对象,即使我没有使用注释,例如@Transactional,我认为它需要代理 我在书中读到以下内容 注意,对静态@Bean方法的调用永远不会被容器拦截,甚至在@Configuration类中也是如此(见上文)。这是由于技术限制:CGLIB子类化只能覆盖非静态方法。因此,对另一个@Bean方法的直接调用将具有标准Java语义,从而直接从工厂方法本身返回一个独立实例 a。在下面的示例中,Spring不返回代理对象,因为静态方法是无

我在学春天:)

我有以下疑问:

  • spring是否为每个bean创建代理对象,即使我没有使用注释,例如@Transactional,我认为它需要代理
  • 我在书中读到以下内容
  • 注意,对静态@Bean方法的调用永远不会被容器拦截,甚至在@Configuration类中也是如此(见上文)。这是由于技术限制:CGLIB子类化只能覆盖非静态方法。因此,对另一个@Bean方法的直接调用将具有标准Java语义,从而直接从工厂方法本身返回一个独立实例

    a。在下面的示例中,Spring不返回代理对象,因为静态方法是无法重写的。所以它会在这里返回原始对象。我说得对吗

       @Configuration
       public class Config {
           @Bean
           public static Student student() {
               return new Student();
           }
       }
    

    b。“注意,对静态@Bean方法的调用永远不会被容器拦截,即使在@Configuration类中也不会被拦截”的含义是什么。是的,你说得对。您将获得原始对象


    b。student()方法位于用@Configuration annotation注释的类Config中。spring通过创建代理来拦截@Configuration类中用@Bean注释的所有方法。所以,由于您的方法是静态的,尽管它在Config类中,但它不会被Spring截获,也不会创建任何代理

    然后回答问题1。spring是否为每个bean创建代理并为此使用基于jdk接口的代理?是的,如果每个bean的生命周期由spring控制,spring将为其创建代理。如果您的Springbean类正在扩展任何接口,spring将使用基于JDK的代理。如果它不扩展任何接口,它将使用基于CGLIB的代理。