基于注解的Spring

一、注解形式将Bean注入IOC容器

  1.1、必须具备配置类,如:

@Configuration
public class MyConfig {

    @Bean    //即id="myPig"
    public Pig myPig() {
        Pig pig = new Pig("佩奇",4,"哈士奇");
        return pig;
    }
}

  1.2、形式分为三层组件和非三层组件

  三层组件的注解:控制层:@Controller

          服务层:@Service

          Dao层:@Respository                                    三层都可用:@Component

    将注解所在包扫描到IOC容器:a.配置文件方式:<context:component-scan base-package="XXX">

                    b.注解方式:

@Configuration
@ComponentScan(value="service")
public class MyConfig {

    @Bean    //即id="myPig"
    public Pig myPig() {
        Pig pig = new Pig("佩奇",4,"哈士奇");
        return pig;
    }
}

    注解方式的各种参数见源码,在此列一个demo

//扫描controller这个包,但是排除这个包中的有关于@Service的注解
@ComponentScan(value="controller",excludeFilters= {@ComponentScan.Filter(type=FilterType.ANNOTATION,value=Service.class)})
//只扫描StudentService这个类,注意一定要关闭默认的扫描才能生效
@ComponentScan(@ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE,value= {StudentService.class})},useDefaultFilters=false)

   非三层组件(如转换器Converter):

    1、也可以使用@Bean+方法的返回值,id默认为方法名;

      2、@Import方式

    3、FactoryBean

  第一种方式在开头已经演示,故而从@Import开始:

@Configuration
@Import({Course.class,CollectionType.class})      //id值为全类名
public class MyConfig {
     ...         
}

  @Import源码中还提到另外两种实现方式:{@link ImportSelector},{@link ImportBeanDefinitionRegistrar}

  FactoryBean:

public class MyFactoryBean implements FactoryBean<Teacher>{

    @Override
    public Teacher getObject() throws Exception {
        // TODO Auto-generated method stub
        return new Teacher();   //放入对象
    }

    @Override
    public Class<Teacher> getObjectType() {
        // TODO Auto-generated method stub
        return Teacher.class;    //放入对象类型
    }

    @Override
    public boolean isSingleton() {
        // TODO Auto-generated method stub
        return true;   //确定为单例模式
    }

}



@Configuration
public class MyConfig {
    @Bean    //id=方法名
    public FactoryBean<Teacher> myFactoryBean(){
        return new MyFactoryBean();
    }
}

  通过该方法获取Bean:  

    @Test
    public void factory() {
        Object bean1 = context.getBean("&myFactoryBean");      //得到MyFactoryBean
        Object bean2 = context.getBean("myFactoryBean");    //得到Teacher
        System.out.println(bean1+"\n"+bean2);
    }

config.MyFactoryBean@1a052a00
entity.Teacher@4d826d77

二、注解形式设置Bean注入的条件

  2.1、创建Condition类

public class CourseCondition implements Condition{

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment environment = context.getEnvironment();    //获取环境
        String pigType = environment.getProperty("pig.type");
        if(pigType.contains("old")) {     //条件是pig的实现类 
            return true;
        }
        return false;               //true将Bean加入IOC容器,反之不加入IOC容器
    }

}

  2.2、创建pig接口和实现类

public interface Pig {

    void syso();
}

public class OldPig implements Pig{...}

  2.3、在配置类中增加@Conditional注解

@Configuration
public class MyConfig {
    @Bean("oldPig")    //即id="myPig"
    @Conditional(CourseCondition.class)
    public OldPig myPig() {
        OldPig pig = new OldPig("佩奇",4,"哈士奇");
        return pig;
    }
}

  最后可以通过更改环境配置来实现注入不同的Bean

猜你喜欢

转载自www.cnblogs.com/709539062rao/p/12616844.html