Spring组件注册

Spring组件注册 @Configuration

@Configuration注解告诉Spring这是一个配置类

@Bean

@Bean注解是给容器中注册一个Bean,类型是返回值的类型,id默认是方法名作为id

@Bean("person") public Person person2(){ System.out.println("create a new bean of person"); return new Person(); } @ComponentScan

@ComponentScan(value = "com.eric",excludeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class, Service.class})

@ComponentScan 的属性

value:指定要扫描的包

excludeFilters = Filter[]:指定扫描的时候按照什么规则排除哪些组件

includeFilters = Filter[]:指定扫描的时候只需要包含哪些组件

/** * Description: spring-parent * 配置类==配置文件 * * @author caoqianqian * @date 2021/2/14 */ @Configuration //告诉Spring这是一个配置类 @ComponentScan(value = "com.eric",excludeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class, Service.class}) }) public class MainConfig { //给容器中注册一个Bean,类型是返回值的类型,id默认是方法名作为id @Bean public Person person(){ return new Person("testName",20); } } @Scope

通过@Scope注解来制定该bean的作用范围,也可以说是调整作用域,ioc容器中加载的组件默认是单实例的。

作用域范围即value的可取值范围

prototype 多实例的:ioc容器启动并不会去调用方法创建对象放到容器中,每次获取的时候才会调用方法创建对象。

singleton 单实例的(默认值):
ioc容器启动时会调用方法创建对象,放到ioc容器中,以后每次获取就是从容器中(map.get())拿

request 同一次请求创建一个实例

session 同一个session创建一个实例

//通过@Scope注解来制定该bean的作用范围,也可以说是调整作用域 @Scope("singleton") @Bean("person") public Person person() { System.out.println("I'm creating an instance Person"); return new Person("Person", 28); } @Lazy 懒加载

单实例bean:默认在容器启动的时候创建对象。
懒加载:容器启动不创建对象,第一次使用(获取)bean时创建对象,并初始化。

单实例bean加上懒加载的注解之后容器启动时不创建对象,第一次使用时才会去创建对象并初始化。

@Bean("person") @Lazy public Person person2(){ System.out.println("create a new bean of person"); return new Person(); } @Conditional

@Conditional按照一定的条件进行判断,满足条件给容器中注册bean

标在方法上,表示这个方法满足一定条件才会生效。

标在类上,类中组件统一设置,表示满足当前条件,这个类中配置的所有bean注册才会生效

判断是否是Linux系统

public class LinuxCondition implements Condition { /** *判断是否是Linux系统 * @param conditionContext 判断条件能使用的上下文(环境) * @param annotatedTypeMetadata 当前标注注解的注释信息 * @return */ @Override public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { //能获取到ioc使用的beanFactory ConfigurableListableBeanFactory beanFactory = conditionContext.getBeanFactory(); //获取类加载器 ClassLoader classLoader = conditionContext.getClassLoader(); //获取当前环境信息 Environment environment = conditionContext.getEnvironment(); //获取bean定义的注册类 BeanDefinitionRegistry registry = conditionContext.getRegistry(); //判断容器中bean的注册情况 boolean definition = registry.containsBeanDefinition("person"); RootBeanDefinition beanDefinition = new RootBeanDefinition(Person.class); //给容器中注册bean registry.registerBeanDefinition("person2",beanDefinition); String property = environment.getProperty("os.name"); if(property.contains("linux")){ return true; } return false; } }

判断是否是Windows系统

public class WindowsCondition implements Condition { @Override public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { Environment environment = conditionContext.getEnvironment(); String osName = environment.getProperty("os.name"); if (osName.contains("Windows")){ return true; } return false; } }

配置类

@Configuration public class MainConfig2 { /** *Conditional({Condition}):按照一定的条件进行判断,满足条件给容器中注册bean * 如果系统是windows,给容器中注册("bill") * 如果系统是linux,给容器中注册("linus") * @return */ @Conditional({WindowsCondition.class}) @Bean("bill") public Person person(){ return new Person("Bill Gates",62); } @Conditional({LinuxCondition.class}) @Bean("linus") public Person person2(){ return new Person("linus",42); } @Bean public ColorFactoryBean colorFactoryBean(){ return new ColorFactoryBean(); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsfsgj.html