一、注解形式将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