Spring注解,组件扫描跟显式配置bean

package pw.jonwinters;

public interface Dessert {
    public void eat();
}

这里定义了一个接口Dessert

package pw.jonwinters;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

@Component
@Cold
@Fruity
public class Cookie implements Dessert,BeanPostProcessor {

    @Override
    
    public void eat() {
        // TODO Auto-generated method stub
        System.out.println("I am Cookie!");
    }

    @Override
    public Object postProcessAfterInitialization(Object arg0, String arg1)
            throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("Cookie bean has been create!");
        return null;
    }

    @Override
    public Object postProcessBeforeInitialization(Object arg0, String arg1)
            throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("Cookie bean has been create!");
        return null;
    }


}

Cookie实现了这个接口,并在创建bean的时候,打印一些字符串

 

package pw.jonwinters;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

@Component
@Cold
@Creamy
public class Cake implements Dessert,BeanPostProcessor {

    @Override
    
    public void eat() {
        // TODO Auto-generated method stub
        System.out.println("I am Cake!");
    }

    @Override
    public Object postProcessAfterInitialization(Object arg0, String arg1)
            throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("Cake bean has been create!");
        return null;
    }

    @Override
    public Object postProcessBeforeInitialization(Object arg0, String arg1)
            throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("Cake bean has been create!");
        return null;
    }

}

Cake实现了接口

 

package pw.jonwinters;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
//@ComponentScan()自己显式配置bean的时候 要关闭组件扫描,否则会出错,Spring in action 第四版上面没有明确说明这一点,请注意
public class DessertConfig {

    @Bean
    @Cold
    @Creamy
    public Dessert getIceCream() {
        return new IceCream();
    }
}
package pw.jonwinters;


import static org.junit.Assert.assertNotNull;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import pw.jonwinters.Dessert;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=DessertConfig.class)
@Component
public class Eat {
    Dessert dessert;
    
    @Autowired
    @Cold
    @Creamy
    public void setDessert(Dessert dessert) {
        this.dessert=dessert;
    }

    @Test
    public void testDessert() {
        assertNotNull(dessert);
        dessert.eat();
    }

    
}
package pw.jonwinters;

public class IceCream implements Dessert {

    @Override
    public void eat() {
        // TODO Auto-generated method stub
        System.out.println("I am Ice!");
    }
    

    
}

总结,开启 显式配置bean的时候 要注意关闭组件自动扫描,否则会运行出错

posted on 2016-09-10 10:14  winters86  阅读(120)  评论(0)    收藏  举报