@Configuration 配置类注入Bean

介绍

使用Spring注解的方式替代传统xml中标签, 同时在springboot中也大量使用了注解的方式.

引入spring-context依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.13.RELEASE</version>
</dependency>

xml配置文件方式

applicationContext.xml 中添加注入Bean, 方式为 声明 Bean 标签, 方式如下:

<!-- 向 ioc 容器中注入 Bean -->
<bean id="user" class="com.liuzhihang.domain.User">
    <property name="id" value="1"/>
    <property name="name" value="liuzhihang"/>
    <property name="age" value="25"/>
    <!--<constructor-arg index="0" value="1"/>-->
    <!--<constructor-arg index="1" value="liuzhihang"/>-->
    <!--<constructor-arg index="2" value="25"/>-->
</bean>

支持 property 属性 setter 方法注入 和 constructor-arg 属性 构造器注入等

Spring注解的方式

使用 @Configuration 注解声明配置类, 同时在配置类中的方法上添加 @Bean 注解, 向容器中注入Bean

@Configuration
public class ApplicationContextConfig {

    /**
     * 容器中注册 Bean 类型返回为返回类型, id 为方法名
     * @return
     */
    @Bean
    public User user() {

        System.out.println("********* ioc 容器中创建 user");
        return new User(2L, "liuzhihang", 25);
    }
}

@Configuration注解

1.声明注解类 ApplicationContextConfig , 并添加 @Configuration 注解

介绍:

添加 @Configuration 注解的类被声明为配置类, 被注解的类内部包含一个或多个被@Bean注解的方法, 这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描, 并用于构建bean定义, 初始化Spring容器

2.注解类要求:
1.配置类不能为 final 要用到动态代理
2.不能是匿名类
3.嵌套的configuration类必须是静态类

@Bean注解

@Bean注解标注的方法上, 将向Ioc容器中注入id为方法名的Bean. 下面是@Bean注解的介绍

/**
 * 注解在方法上, 指示一个方法产生一个由Spring容器管理的Bean
 * Bean 的 name 默认为方法名
 * Bean 不提供 profile, scope, lazy, depends-on or primary 等属性, 可以通过相应注解进行配合使用
 * 注解的方法 不能为 private 或 final 修饰
 *
 * @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) 注解使用范围 为方法 和 注解上
 * @Retention(RetentionPolicy.RUNTIME) 保留至运行时
 * @Documented 注解被javadoc工具记录
 *
 */
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {

    /**
     * 注解名称
     */
    @AliasFor("name")
    String[] value() default {};

    /**
     * 注解名称 也可使用 value
     */
    @AliasFor("value")
    String[] name() default {};

    /**
     * 是否通过名称或类型通过基于约定的自动装配来注入依赖项
     */
    Autowire autowire() default Autowire.NO;

    String initMethod() default "";

    String destroyMethod() default AbstractBeanDefinition.INFER_METHOD;

}

测试及结果

/**
 * 通过引入 xml 配置文件的方式 从容器中获取bean
 * <p>
 * Springboot 更多的使用的是注解方式向容器中注入bean
 *
 * @Description:
 * @Author: liuzhihang
 * @Date: 2018/5/15 22:25
 */
public class MyApplicationContext {

    public static void main(String[] args) {

        // xml 配置方式
        // xmlConfig();

        // annotation 配置方式
        annotationConfig();
    }

    private static void annotationConfig() {
        // 获取容器
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ApplicationContextConfig.class);
        User user = applicationContext.getBean(User.class);
        System.err.println(user.toString());


    }


    private static void xmlConfig() {

        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

        Object user = applicationContext.getBean("user");
        System.out.println(user.toString());
    }
}

控制台输出结果:

User{id=1, name='liuzhihang', age=25}

********* ioc 容器中创建 user
User{id=2, name='liuzhihang', age=25}


   转载规则


《@Configuration 配置类注入Bean》 liuzhihang 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录