1 包扫描+组件标注注解
1.1 简单使用
@ComponentScan("com.yunfeng.spring2")
public class MainConfig {
}
- 在自己创建的类上加
@Controller
、@Service
、@Repository
、@Component
注解
@Controller
public class BookController {
}
1.2 ConponentScan自定义扫描规则
- 创建
MyComponentScanTypeFilter
并实现TypeFilter
package com.yunfeng.spring2.config;
import org.springframework.core.io.Resource;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.ClassMetadata;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.filter.TypeFilter;
import java.io.IOException;
public class MyComponentScanTypeFilter implements TypeFilter {
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
ClassMetadata classMetadata = metadataReader.getClassMetadata();
Resource resource = metadataReader.getResource();
String className = classMetadata.getClassName();
if (className.contains("mapper")) {
return true;
}else {
return false;
}
}
}
package com.yunfeng.spring2.config;
import com.yunfeng.spring2.entity.Person;
import org.springframework.context.annotation.*;
@Configuration
@ComponentScans(value = {
@ComponentScan(value = "com.yunfeng.spring2",includeFilters = {
@ComponentScan.Filter(type = FilterType.CUSTOM,classes = {MyComponentScanTypeFilter.class})
},useDefaultFilters = false)
})
public class MainConfig {
@Bean(value = "person")
public Person addPerson(){
return new Person("胡思源",16);
}
}
2 @Bean导入的第三方包里面的组件
2.1 简单使用
@ComponentScan(value = "com.yunfeng.spring2")
public class MainConfig {
@Bean(value = "person")
public Person addPerson(){
return new Person("胡思源",16);
}
}
2.2 自定义条件注入
- 新建
WindowsCondition
并实现Condition
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class WindowsCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata annotatedTypeMetadata) {
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
ClassLoader classLoader = context.getClassLoader();
Environment environment = context.getEnvironment();
BeanDefinitionRegistry registry = context.getRegistry();
String property = environment.getProperty("os.name");
if (property.contains("Windows")){
return true;
}
return false;
}
}
@Conditional(WindowsCondition.class)
@Bean(value = "bill")
public Person addPerson1(){
return new Person("bill",76);
}
@Test
public void test03(){
Environment environment = context.getEnvironment();
System.out.println(environment.getProperty("os.name"));
Map<String, Person> persons = context.getBeansOfType(Person.class);
System.out.println("persons = " + persons);
}
3 @Import快速给容器中导入一个组件
3.1 @Import直接导入
@Configuration
@Import({Color.class, Red.class})
public class MainConfig2 {
}
3.2 使用ImportSelector返回需要导入的组件的全类名数组
- 新建
MyImportSelector
并实现ImportSelector
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{"com.yunfeng.spring2.config.Blue","com.yunfeng.spring2.config.Yellow"};
}
}
@Configuration
@Import({Color.class, Red.class,MyImportSelector.class})
public class MainConfig2 {}
3.3 使用ImportBeanDefinitionRegistrar自定义注入Bean
- 新建MyImportBeanDefinitionRegistrar并实现ImportBeanDefinitionRegistrar
import com.yunfeng.spring2.entity.RainBow;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) {
boolean definition1 = registry.containsBeanDefinition("com.yunfeng.spring2.entity.Red");
boolean definition2 = registry.containsBeanDefinition("com.yunfeng.spring2.entity.Blue");
if (definition1 && definition2){
RootBeanDefinition definition = new RootBeanDefinition(RainBow.class);
definition.setScope("prototype");
registry.registerBeanDefinition("RainBow",definition);
}
}
}
@Configuration
@Import({Color.class, Red.class, MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
public class MainConfig2 {}
4 使用FactoryBean<T>
注入组件
- 创建
ColorFactoryBean
并实现FactoryBean<Color>
import org.springframework.beans.factory.FactoryBean;
public class ColorFactoryBean implements FactoryBean<Color> {
@Override
public Color getObject() throws Exception {
return new Color();
}
@Override
public Class<?> getObjectType() {
return Color.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
@Bean
public ColorFactoryBean colorFactoryBean(){
return new ColorFactoryBean();
}
@Test
public void test04(){
String[] names = context.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
Object colorFactoryBean = context.getBean("colorFactoryBean");
System.out.println(colorFactoryBean.getClass());
Object colorFactoryBean2 = context.getBean("&colorFactoryBean");
System.out.println(colorFactoryBean2.getClass());
}