@Bean 注解

news/2024/7/1 22:37:40

@Configuration 以及其中的 @Bean 注解

@Configuration 注解:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
    String value() default "";
}

从定义来看, @Configuration 注解是用 @Component 注解的, 因此 <context:component-scan/> 或者 @ComponentScan 都能处理 @Configuration 注解的类.

@Configuration 注解的类中可以声明一个或多个 @Bean 注解的方法. 并且可以由 Spring 容器帮我们管理.

 @Configuration
 public class AppConfig {

     @Bean
     public MyBean myBean() {
         // instantiate, configure and return bean ...
     }
 }

userInfo() 方法可以直接调用同一类中的其他 @Bean 方法来引用它们. 这也说明这种方式使用的是同一个 bean.

@Configuration
public class MyBeanConfig {

    @Bean
    public Country country(){
        return new Country();
    }

    @Bean
    public UserInfo userInfo(){
        return new UserInfo(country());
    }

}
注: 在运行时对每个这样的配置类( @Configuration)进行CGLIB子类化. 因此 @Configuration 类及其工厂方法不能标记为 final 或 private.

@Configuration 标记的类必须符合下面的要求:

  • 配置类必须以类的形式提供(不能是工厂方法返回的实例), 允许通过生成子类在运行时增强 (cglib 动态代理).
  • 配置类不能是 final 类 (没法动态代理).
  • 配置类必须是非本地的 (即不能在方法中声明)
  • 任何嵌套配置类都必须声明为static。
  • @Bean 方法可能不会反过来创建进一步的配置类 (也就是返回的 bean 如果带有 @Configuration, 也不会被特殊处理, 只会作为普通的 bean).

@Bean Lite Mode

@Bean 注解也可以在没有使用 @Configuration 注解的类中声明. 例如, 可以在 @Component 类中声明, 甚至可以在普通的旧类中声明. 在这种情况下, @Bean方法将以所谓的“lite”模式进行处理.

 @Component
 public class Calculator {
     public int sum(int a, int b) {
         return a+b;
     }

     @Bean
     public MyBean myBean() {
         return new MyBean();
     }
 }

@Configuration 中的 bean 是相反的, 当一个 @Bean 方法在lite模式下调用另一个 @Bean 方法时, 调用是标准的Java方法调用; Spring不会通过CGLIB代理拦截调用.

 @Component
public class MyBeanConfig {

    @Bean
    public Country country(){
        return new Country();
    }

    @Bean
    public UserInfo userInfo(){
        return new UserInfo(country());
    }

}

在lite模式下每执行一次 new UserInfo(country()); 都会创建一个新的 Country 对象, 这就是上面所说标准的Java方法调用.


http://www.niftyadmin.cn/n/3032410.html

相关文章

poj 3613(最短路)

题意&#xff1a;求解经过不多于某边数的最短路 思路&#xff1a;矩阵连乘&#xff0c;乘的次数就是不多于某边数的最短路&#xff0c;题目给出的顶点需要映射处理 View Code 1 #include<iostream>2 #include<map>3 #include<stdio.h>4 #include<string.…

Netty——BIO,NIO,AIO精讲

目录 0、总结&#xff1a; 一、BIO(Blocking IO) 同步阻塞模型&#xff0c; 二、NIO(Non Blocking IO) 同步非阻塞 三、AIO(NIO 2.0) 异步非阻塞 BIO、 NIO、 AIO 对比&#xff1a; 0、总结&#xff1a; 1、BIO(Blocking IO)同步阻塞模型&#xff0c;一个客户端连接对应一个处理…

6. 抽象类和接口

1. 抽象类 当我们的方法没有具体的实现,那么这个时候我们可以将这个方法定义为抽象方法,把定义这个方法的类定义为抽象类. //抽象类 public abstract class Shape {public int a;public static int b ;public void func() {}//抽象方法abstract public void draw();}使用 abs…

jsp到servletURL编码问题

在servlet中获取的jsp表单内容 java.net.URLDecoder.decode(body,"UTF-8");用这个方法进行编码就能获取到中文字符了.转载于:https://www.cnblogs.com/wysAC666/p/10361286.html

Netty02——核心功能与线程模型精练

目录 一、Netty初探 1.1、Netty的使用场景&#xff1a; 二、Netty线程模型 三、Netty模块组件 四、Netty通讯示例 五、ByteBuf详解 六、Netty实战聊天室系统 一、Netty初探 NIO 的类库和 API 繁杂&#xff0c; 使用麻烦&#xff1a; 需要熟练掌握Selector、 ServerSock…

轻量级流程图控件GoJS最新版本v2.1.42发布,十项功能修复 | 附下载

GoJS是一款功能强大&#xff0c;快速且轻量级的流程图控件&#xff0c;可帮助你在JavaScript 和HTML5 Canvas程序中创建流程图&#xff0c;且极大地简化您的JavaScript / Canvas 程序。 点击下载GoJS最新版 如果您对该图表控件感兴趣&#xff0c;欢迎加入图表控件QQ交流群&…

移动互联网服务客户端开发技巧系列

基于网络的客户端开发技巧——第一篇http://www.1000phone.net/thread-8058-1-1.html基于网络的客户端开发技巧——第二篇Webview及正则http://www.1000phone.net/thread-8061-1-1.html基于网络的客户端开发技巧——第三篇上下拖动切换页面http://www.1000phone.net/thread-806…

TeeChart for .NET图表控件如何图例控制

TeeChart for .NET是优秀的工业4.0 WinForm图表控件&#xff0c;官方独家授权汉化&#xff0c;集功能全面、性能稳定、价格实惠等优势于一体。TeeChart for .NET 中文版还可让您在使用和学习上没有任何语言障碍&#xff0c;至少可以节省30%的开发时间。 点击立即下载最新版Tee…