Spring学习(二十二)--@Configuration和@Bean

Posted on 2019-11-06 23:08  GLLegolas  阅读(336)  评论(0编辑  收藏  举报

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>标签的作用