zoukankan      html  css  js  c++  java
  • Spring学习(二十二)--@Configuration和@Bean

    1.@Configuration注解

    该注解是使用在class上的一个注解,等价于XML中配置beans,相当于Ioc容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean,与xml中配置的bean意思一样。

    2.@Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里。被@Bean注解的方法返回值应为一个类,通过@Bean可以将方法返回的类注册到spring的Context中。

    Bean的初始化方法和销毁方法,可以在 @Bean(initMethod = "init",destroyMethod = "destory")注解指定

    1、写一个类Wanzi.class

    package beans;
    
    import interfaces.WanziInterfece;
    
    public class Wanzi{
    
        String wanzi = "wanzi";
            
        public Wanzi(){
            System.out.println("Wanzi.class 的构造方法");
        }
        
        public String getWanzi(){
            return wanzi;
        }
    }

    2、写一个WanziConfig.java

    package springAnnotions;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Description;
    import org.springframework.context.annotation.Scope;
    
    import beans.Wanzi;
    
    /**
     * @Configuration注解相当于Ioc容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean,与xml中配置的bean意思一样。
     * @Configuration注解的类必需在spring.xml中使用<context:component-scanbase-package="XXX"/>扫描该文件所在的包
     * @author qiaozhong
     */
    @Configuration
    public class WanziConfig {
    
        @Bean(name="wanzi")
        @Scope("prototype")
        @Description("这是一个对@Bean注解的测试")
        public Wanzi getWanzi(){
            return new Wanzi();
        }
    }

    3、配置spring-annotion.xml扫描WanziConfig.java所在的包

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd ">
    
            <!-- 支持@Value获取properties中的值 -->
            <bean id="appProperty" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
                <property name="locations">
                    <array>
                        <value>classpath:application.properties</value>
                    </array>
                </property>
            </bean>
        
        <!-- 配置自动扫描的包 -->
        <context:component-scan base-package="springAnnotions"></context:component-scan>
    
    </beans>

    4、写测试类WanziConfigTest.java

    package springAnnotions;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    import org.springframework.test.context.transaction.TransactionConfiguration;
    
    import beans.Wanzi;
    
    @RunWith(SpringJUnit4ClassRunner.class) 
    @ContextConfiguration("/springConfig/spring-all.xml") 
    @TransactionConfiguration
    public class WanziConfigTest {
        
        @Autowired
        private Wanzi wanzi;
        
        @Test
        public void testConfigurationAnnotion(){
            System.out.println(wanzi.getWanzi());
        }
    }

    测试结果:

    Wanzi.class 的构造方法
    wanzi

    可以看到,在执行测试的时候,打印了Wanzi.java的构造函数,同时返回了wanzi.getWanzi()的值。

    说明通过@configuration和@Bean已经将Wanzi.class注入到spring的上下文中。

    @configuration和@Bean实现了spring的<bean>标签的作用

    个人理解,如有错误,欢迎指正!
  • 相关阅读:
    Go语言基础之包
    Go语言基础之结构体
    Go语言基础之函数
    Go语言基础之map
    Go语言基础之指针
    Go语言基础之切片
    Go语言基础之数组
    02-Spring配置文件加载
    01-Spring概述(总览)
    将博客搬至CSDN
  • 原文地址:https://www.cnblogs.com/gllegolas/p/11809373.html
Copyright © 2011-2022 走看看