1、@ComponentScan+注解(@Controller, @Repository, @Component, @Service)
使用includeFilters时,需设置 useDefaultFilters = false
2、@Bean注解,
1)@Lazy标记单例bean 懒加载,
2)@Scope("prototype")定义bean的是否单例,
3)@Conditional({MyCondition.class}) 符合条件才可以生成bean
3、@Import注解
4、实现ImportSelector的接口
5实现ImportBeanDefinitionRegistrar接口,覆盖registerBeanDefinitions方法,给容器中添加某个beanDefinition信息
6、实现FactoryBean接口
1)通过FactoryBean获取的bean是工厂生产的bean
Object bean = context.getBean("homeFactoryBean");
2) 想要获取工厂bean本身需要在beanName前面加 '&'
Object bean = context.getBean("&homeFactoryBean");
注:下面代码是笔记,比较乱,大概看下上面思路就好。
配置类
@ComponentScan(basePackages = {"com.whf.spring.bean"},
// excludeFilters = {
// @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class, Service.class})},
includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Service.class})},
useDefaultFilters = false
)
@Import({People.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
@Configuration
public class MainConfig {
@Conditional({MyCondition.class})
@Bean(value = "user", initMethod = "init")
@Lazy
// @Scope("prototype")
public User user() {
User user = new User();
return user;
}
@Bean
public HomeFactoryBean homeFactoryBean() {
return new HomeFactoryBean();
}
}
涉及到的类
class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.whf.spring.bean.myimport.Selector"};
}
}
class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(MyDefinitionBean.class);
registry.registerBeanDefinition("myDefinitionBean", rootBeanDefinition);
}
}
class HomeFactoryBean implements FactoryBean<Home> {
@Override
public Home getObject() throws Exception {
return new Home();
}
@Override
public Class<?> getObjectType() {
return Home.class;
}
}
测试类
public class BeanDemo {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class);
String[] beanDefinitionNames = context.getBeanDefinitionNames();
for (String name : beanDefinitionNames) {
System.out.println(name);
}
Object user01 = context.getBean("user");
Object user02 = context.getBean("user");
System.out.println(user01.equals(user02));
System.out.println("****************factoryBean******************");
Object homeFactoryBean = context.getBean("homeFactoryBean");
System.out.println("homeFactoryBean的类型是:" + homeFactoryBean.getClass());
Object bean = context.getBean("&homeFactoryBean");
System.out.println("&homeFactoryBean的类型是:" + bean.getClass());
}
}